使用场景指定应用程序视图层次结构
A scene contains the view hierarchy of your app.
场景包含应用程序的视图层次结构。
SwiftUI提供了帮助创建应用程序用户界面的构建块(Building Blocks)。Scene就是其中一个构建块,它包含定义用户程序用户界面的视图层次结构。开发者可以在SwiftUI提供的场景中指定应用程序的视图层次结构,也可以创建自定义的场景。
将场景添加到应用程序
// MyApp.swift
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
TabView {
ContentView()
.tabItem {
Label("Journal", systemImage: "book")
}
SettingsView()
.tabItem {
Label("Settings", systemImage: "gear")
}
}
}
}
}
-
Computed
body
property(计算属性body)可以返回一个或多个主要和次要的Scenes。 -
在此示例中,
body
返回主场景WindowGroup
。 -
视图层次结构的根节点是
TabView
,这是一个容器视图,它可以提供一些选项卡,并且可以使用这些选项卡在不同的子视图直接切换。 -
TabView
包含两个自定义子视图:ContentView
和SettingsView
. -
.tabItem
告诉TabView
每个选项卡中显示的图像和文本。
定义其它的视图层次结构
// MyApp.swift
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
#if os(iOS)
WindowGroup {
TabView {
ContentView()
.tabItem {
Label("Journal", systemImage: "book")
}
SettingsView()
.tabItem {
Label("Settings", systemImage: "gear")
}
}
}
#elseif os(macOS)
WindowGroup {
AlternativeContentView()
}
Settings {
SettingsView()
}
#endif
}
}
该示例使用了平台条件编译块(Platform Conditional Compilation Block,有关条件编译块的更多信息,请参见[编译器控制语句](Statements — The Swift Programming Language (Swift 5.7))),#if os(iOS)
告诉Swift编译器仅在目标平台为iOS时编译代码,#elseif os(macOS)
同样表示用单独的平台有条件的编译Mac应用程序的场景,条件编译块以#endif
结束。
-
在iOS平台,该示例使用包含TabView的WindowGroup场景定义视图层次。并且,TabView包含两个子视图:ContentView和SettingsView。
-
在macOS平台,使用WindowGroup场景中的其它视图层次,此层次结构的根节点是自定义视图
AlternativeContentView
。 -
Settings {}
场景仅在macOS中可用,示例使用次要场景(Secondary Scene)Settings来提供可在应用程序菜单中使用设置菜单项。设置场景包含了自定义视图SettingView
。
创建自定义场景
自定义场景可以帮助代码更具可读性和更易于维护。
A custom scene is one that you compose from other scenes.
自定义场景是从其它场景合成的场景。
自定义场景MyScene
是为了描述在iOS设备上显示的场景,MyScene
遵循Scene
。
// MyScene.swift
import SwiftUI
struct MyScene: Scene {
var body: some Scene {
WindowGroup {
TabView {
ContentView()
.tabItem {
Label("Journal", systemImage: "book")
}
SettingsView()
.tabItem {
Label("Settings", systemImage: "gear")
}
}
}
}
}
- 符合
Scene
的结构必须实现计算属性body
,就像遵循App
协议的结构一样。
同样的自定义场景MyAlternativeScene
是为了描述在macOS设备上显示的场景,MyAlternativeScene
遵循Scene
。并必须实现计算属性body
。
// MyAlternativeScene.swift
import SwiftUI
struct MyAlternativeScene: Scene {
var body: some Scene {
WindowGroup {
AlternativeContentView()
}
#if os(macOS)
Settings {
SettingsView()
}
#endif
}
}
重构代码使用自定义场景
// MyApp.swift
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
#if os(iOS)
MyScene()
#elseif os(macOS)
MyAlternativeScene()
#endif
}
}