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 的强大功能进行响应式编程。