App
表示App的结构和行为。
protocol App
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
Text("Hello, world!")
}
}
}
-
在MyApp前面加上
@main属性,表示进入App的唯一入口点。 -
@main 底层实现了App的
main()方法。 -
在App中定义的常量、变量其生命周期与整个app是完全一致的。
-
管理
App的生命周期
Scene
Scene,
场景, 定义了 App 用户界面group(分组)。每个场景充当视图层次结构的根视图,并能够监听App的生命周期。
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 含有不同的状态。
App生命周期管理
import SwiftUI
@main
struct TestApp: App {
@Environment(\.scenePhase) var scenePhase
// 相当于以前的 didFinishLaunching 方法,进行初始化操作
init() {
print("Application is starting...")
}
var body: some Scene {
WindowGroup {
Text("Hello world")
}.onChange(of: scenePhase) { newScenePhase in
switch newScenePhase{
case .active: // 进入前台
print("active")
case .background: // 进入后台
print("background")
case .inactive: // 不活跃状态
print("inactive")
default:
print("default")
}
}
}
}
SwiftUI使用ScenePhase来跟踪App的状态,使用 @Environment 属性包装器来获取当前值,用 .onChange(of:perform:) 监听更改。