文章

App:应用程序的结构和行为

swiftui-logo SwiftUI 的 App 协议定义了一个 SwiftUI 应用的顶级结构和行为。

通过遵循 App 协议,你可以定义一个结构体来表示你的整个应用,并使用这个结构体来配置应用的场景和生命周期行为。

定义你的 App

要创建一个遵循 App 协议的结构体,你需要定义一个 body 属性,该属性返回一个或多个 Scene 实例。这些 Scene 描述了应用的用户界面和可能的状态。例如:

1
2
3
4
5
6
7
8
9
10
import SwiftUI

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

在这个例子中,MyApp 结构体通过 @main 属性标记为程序的入口,并遵循 App 协议,实现了必需的 body 属性。body 属性返回了一个 WindowGroup 场景,该场景包含了一个 ContentView 实例。当你的应用启动时,它会自动创建一个包含 ContentView 的新窗口。

配置多个场景

如果你的应用需要支持多个窗口或视图,你可以在 body 属性中定义多个 Scene。例如,你可以添加一个设置场景:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import SwiftUI

@main
struct Mail: App {
    var body: some Scene {
        WindowGroup {
            MailViewer()
        }.commands {  
            // 定义与这个场景相关的命令  
        }
        Settings {
            SettingsView()
        }
    }
}

生命周期

App 结构体内部处理了应用场景的生命周期管理,比如启动时的初始化、从后台恢复到前台时的状态恢复、以及设备旋转导致的界面重排布等。这使得开发者无需直接干预这些底层细节,而能集中精力于构建用户界面和业务逻辑。

状态共享

App 支持在应用程序中声明状态,以在整个应用范围内共享数据和资源。例如,可以使用 StateObject 初始化数据模型,然后将该模型作为 ObservedObject 传递给其他视图,或者通过 .environment.environmentObject 传递给应用程序中的 Scenes。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import SwiftUI

@main
struct Mail: App {
    @StateObject private var model = MailModel()

    var body: some Scene {
        WindowGroup {
            MailViewer()
                .environmentObject(model) // Passed through the environment.
        }
        Settings {
            SettingsView(model: model) // Passed as an observed object.
        }
    }
}

注意:

  • 在 iOS 14.0+ 和 macOS 11.0+ 推荐使用 App 协议来构建应用。然而,如果你的应用需要支持更早的操作系统版本,你可能需要使用传统的 UIApplicationDelegateNSApplicationDelegate
  • App 协议是 SwiftUI 框架的一部分,因此在使用之前需要确保你的项目已经导入了 SwiftUI 框架。

相关链接

本文由作者按照 CC BY 4.0 进行授权

© Liam. 保留部分权利。

本博客由 Jekyll 生成,使用 Chirpy 作为主题