Apps_Scenes_Views - ShenYj/ShenYj.github.io GitHub Wiki

Apps、Scenes、Views

SwiftUI 将整个原有的平台差异部分抽象为 App 和 Scene,对于一个 mac/iOS/iPad/watch/tv/..应用,来说 App 代表了整个应用,Scene 代表了与 Window 相关的多窗口,有些设备只有一个 Scene 有些则有多个,虽然不同的 OS 确实存在差异,但是在语义层面达到了一致。

App

App 是一个协议,用于定义整个应用的结构和入口。

使用场景:

  • 用于配置应用的全局属性(如 @main 入口)

  • 定义应用的初始场景(Scene)和生命周期

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

关键点

  • 必须使用 @main 标记,表示应用的入口。
  • body 返回一个或多个 Scene(如 WindowGroup)。

Scene

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 是一个协议,用于定义具体的界面元素。
每个 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 的生命周期最短,随界面变化而动态创建和销毁

e.g. 以下是一个完整的示例,展示 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")
    }
}
⚠️ **GitHub.com Fallback** ⚠️