SwiftUI中App启动入口分析,以及视图和App生命周期介绍

1,323 阅读3分钟

App入口分析

新创建的swiftui项目中我们应该先要了解一下app的入口函数在哪里,并了解大概的含义。

@main:标记应用程序的入口。

App 协议:SwiftUI 应用程序的入口点。

Scene:表示应用程序的一个视图层级,通常是 WindowGroup,表示主窗口的内容。

Scene讲解

Scene 表示应用程序的一个实例,它管理视图的内容和状态。一个应用可以包含多个场景,例如在 iPad 上的多窗口支持。常用的场景类型:

WindowGroup:管理应用的主窗口。
DocumentGroup:用于文档编辑类型的应用。
Settings:用于应用的设置界面。

App根据场景类型、平台和上下文以不同的方式呈现场景。场景可能会填满整个屏幕、部分屏幕、窗口、窗口中的选项卡或其他内容。比如相同的代码在iOS和macOS下的呈现不同。

iOS和WatchOS中,只能呈现一个场景,也就是一个页面(窗口):

在iPadOS中(如打开多窗口支持),最多可以打开两个运行窗口(Scene),可以分屏显示,也可以全屏独立显示:

在macOS中,可以打开多个窗口,并通过程序菜单中的窗口菜单来进行多窗口管理。macOS 还可以支持将多个相关的窗口合并为一组,在这种情况下多个 Scene 被一个选项卡组合展示,但是这个共享的 Window 也有自己单独的 Scene, 并且将选中的子 Scene 展示出来:

WindowGroup介绍

如果在一个WindowGroup加入多个View,呈现状态有点类似VStack。在一个Scene中加入多个WindowGroup,只有最前面的可以被显示。以 macOS 为例 WindowGroup 可以实例化多个 Scene,这些不同的 Scene 可以单独的响应用户的事件,虽然每个 Scene 都来自同一份 UI 定义,但是不同时刻的用户行为也会导致不同的 Scene 含有不同的状态。

View视图生命周期

init(viewModel:):当视图被创建时,也就是struct view的初始化函数,用于初始化视图的状态和属性。

body:返回视图的体验,定义视图的外观和行为。

onAppear:当视图出现在屏幕上时调用。

onDisappear:当视图从屏幕上消失时调用。

struct ContentView: View {
 
    init() {
        // 视图创建时的初始化
        print("View has been initialized.")
    }
    
    var body: some View {
        Text("Hello, World!")
            .onAppear {
                print("ContentView appeared")
            }
            .onDisappear {
                print("ContentView disappeared")
            }
    }
}

数据驱动的视图更新

SwiftUI 使用状态驱动的方式管理视图的更新。通过 @State@Binding@ObservedObject@EnvironmentObject 等属性包装器,可以管理和传递数据。

struct CounterView: View {
    @State private var count = 0

    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button(action: {
                count += 1
            }) {
                Text("Increment")
            }
        }
    }
}

@State:管理视图内部状态,状态变化时自动更新视图。

@Binding:允许在多个视图间共享和同步状态。

@ObservedObject:绑定到外部的可观察对象。

@EnvironmentObject:从环境中获取数据,适用于依赖于环境数据的视图。

生命周期方法

SwiftUI 提供了一些方法和属性包装器来处理生命周期事件:

onAppear 和 onDisappear:处理视图的显示和隐藏。
task:在视图出现时启动异步任务。
scenePhase:监听应用的场景状态(活跃、非活跃和后台)。

@main
struct MyApp: App {
    @Environment(\.scenePhase) private var scenePhase

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .onChange(of: scenePhase) { newPhase in
            switch newPhase {
            case .active:
                print("App is active")
            case .inactive:
                print("App is inactive")
            case .background:
                print("App is in background")
            @unknown default:
                print("Unexpected new value.")
            }
        }
    }
}

SwiftUI 简化了应用程序的生命周期管理,通过声明性的方式构建和更新用户界面。理解 SwiftUI 的应用程序、场景和视图生命周期有助于开发者更高效地构建应用,并利用 SwiftUI 的强大功能进行响应式编程。