使用场景指定应用程序视图层次结构
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
bodyproperty(计算属性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
}
}
本文介绍SwiftUI中的Scene概念,如何使用预定义及自定义场景来组织应用程序的不同视图层次结构,包括在不同平台上定义特定视图的方法。
188

被折叠的 条评论
为什么被折叠?



