Apps_Scenes_Views - ShenYj/ShenYj.github.io GitHub Wiki
SwiftUI 将整个原有的平台差异部分抽象为 App 和 Scene,对于一个 mac/iOS/iPad/watch/tv/..应用,来说 App 代表了整个应用,Scene 代表了与 Window 相关的多窗口,有些设备只有一个 Scene 有些则有多个,虽然不同的 OS 确实存在差异,但是在语义层面达到了一致。
App 是一个协议,用于定义整个应用的结构和入口。
使用场景:
-
用于配置应用的全局属性(如 @main 入口)
-
定义应用的初始场景(Scene)和生命周期
import SwiftUI @main struct MyApp: App { var body: some Scene { WindowGroup { ContentView() } } }
关键点
- 必须使用 @main 标记,表示应用的入口。
- body 返回一个或多个 Scene(如 WindowGroup)。
Scene 是一个协议,用于定义应用的一个界面层次或窗口
一个应用可以包含多个 Scene,每个 Scene 可以是一个窗口、一组视图或一个特定的界面模式
使用场景
-
用于管理应用的窗口、多窗口支持、或特定界面模式(如设置界面)
-
常见的 Scene 类型包括 WindowGroup、Settings、DocumentGroup 等
import SwiftUI struct MyApp: App { var body: some Scene { WindowGroup { ContentView() } Settings { SettingsView() } } }
关键点
- Scene 是 App 的组成部分,用于定义应用的界面层次。
- 可以包含多个 Scene,每个 Scene 可以独立管理自己的视图和状态
iOS和WatchOS中,只能呈现一个场景,也就是一个页面(窗口)
在iPadOS中(如打开多窗口支持),最多可以打开两个运行窗口(Scene),可以分屏显示,也可以全屏独立显示
在macOS中,可以打开多个窗口,并通过程序菜单中的窗口菜单来进行多窗口管理。macOS 还可以支持将多个相关的窗口合并为一组,在这种情况下多个 Scene 被一个选项卡组合展示,但是这个共享的 Window 也有自己单独的 Scene, 并且将选中的子 Scene 展示出来
View 是一个协议,用于定义具体的界面元素。
每个 View 代表一个可视化的 UI 组件,如按钮、文本、列表等。
使用场景
-
用于构建具体的用户界面
-
可以组合多个 View 来创建复杂的界面
import SwiftUI struct ContentView: View { var body: some View { VStack { Text("Hello, World!") Button("Click Me") { print("Button clicked") } } } }
关键点
- View 是 Scene 的组成部分,用于定义具体的界面内容
- View 是 SwiftUI 中最基础的构建块,支持组合和复用
- 层级关系:
- App 包含一个或多个 Scene
- Scene 包含一个或多个 View
- 职责划分:
- App:定义应用的整体结构和入口
- Scene:管理应用的界面层次(如窗口、设置界面等)
- View:构建具体的用户界面
- 生命周期:
- App 的生命周期最长,负责整个应用的生命周期管理
- Scene 的生命周期次之,负责特定界面层次的生命周期
- View 的生命周期最短,随界面变化而动态创建和销毁
import SwiftUI
// App 入口
@main
struct MyApp: App {
var body: some Scene {
// 主窗口
WindowGroup {
ContentView()
}
// 设置窗口
Settings {
SettingsView()
}
}
}
// 主界面
struct ContentView: View {
var body: some View {
VStack {
Text("Welcome to MyApp")
Button("Open Settings") {
// 打开设置
}
}
}
}
// 设置界面
struct SettingsView: View {
var body: some View {
Text("Settings")
}
}