App:应用程序的结构和行为
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
协议来构建应用。然而,如果你的应用需要支持更早的操作系统版本,你可能需要使用传统的UIApplicationDelegate
或NSApplicationDelegate
。App
协议是 SwiftUI 框架的一部分,因此在使用之前需要确保你的项目已经导入了 SwiftUI 框架。
相关链接
本文由作者按照 CC BY 4.0 进行授权