dismiss
通常作为 Environment
的一部分被讨论,而不是作为单独的函数。你可以在以下位置找到相关信息:
- SwiftUI 文档中的
Environment
部分:https://developer.apple.com/documentation/swiftui/environment DismissAction
的文档:https://developer.apple.com/documentation/swiftui/dismissaction
@Environment(\.dismiss) private var dismiss
和随后调用 dismiss()
是 SwiftUI 中用于关闭或退出当前视图的一种机制。让我详细解释一下这个过程:
@Environment(\.dismiss)
:这是一个环境值,它提供了一个用于关闭当前视图的函数。
使用
@Environment
属性包装器来访问这个环境值。private var dismiss
:这将环境中的 dismiss 函数赋值给一个本地变量。
这个变量现在包含了一个可以调用的函数。
调用
dismiss()
:当你在代码中调用
dismiss()
时,它会触发关闭当前视图的操作。这通常用于以编程方式关闭模态视图、弹出视图或从导航堆栈中弹出当前视图。
让我们通过一个例子来说明这个用法:
import SwiftUI
struct ContentView: View {
@State private var showingDetail = false
var body: some View {
Button("Show Detail") {
showingDetail = true
}
.sheet(isPresented: $showingDetail) {
DetailView()
}
}
}
struct DetailView: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
VStack {
Text("This is the detail view")
Button("Dismiss") {
dismiss()
}
}
}
}
在这个例子中:
ContentView
包含一个按钮,点击时会显示一个模态视图(DetailView
)。- 在
DetailView
中,我们使用@Environment(\.dismiss)
来获取 dismiss 函数。 DetailView
中的 “Dismiss” 按钮调用dismiss()
函数,这会关闭模态视图并返回到ContentView
。
这种方法的优点包括:
- 它是 SwiftUI 的声明式方法的一部分,使代码更加简洁和易于理解。
- 它允许子视图自行决定何时关闭,而不需要父视图的直接干预。
- 它适用于各种情况,如模态视图、导航视图和自定义的呈现方式。
使用 @Environment(\.dismiss)
和 dismiss()
是 SwiftUI 中管理视图生命周期和用户界面流的推荐方式,特别是在处理模态视图和导航时。这种方法提供了一种统一的、声明式的方式来处理视图的关闭,无论视图是如何呈现的。是的,dismiss
函数在 SwiftUI 中是相当通用的。它可以用于多种情况下关闭或退出当前视图,包括模态视图、sheets、全屏覆盖和导航堆栈中的视图。
让我再提供一个简单的例子,展示 dismiss
在不同情况下的使用:
import SwiftUI
struct ContentView: View {
@State private var showingSheet = false
@State private var showingFullScreenCover = false
var body: some View {
NavigationStack {
VStack(spacing: 20) {
Button("Show Sheet") {
showingSheet = true
}
Button("Show Full Screen Cover") {
showingFullScreenCover = true
}
NavigationLink("Push to Detail View") {
DetailView()
}
}
.navigationTitle("Dismiss Examples")
.sheet(isPresented: $showingSheet) {
SheetView()
}
.fullScreenCover(isPresented: $showingFullScreenCover) {
FullScreenView()
}
}
}
}
struct SheetView: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
Button("Dismiss Sheet") {
dismiss()
}
}
}
struct FullScreenView: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
Button("Dismiss Full Screen") {
dismiss()
}
}
}
struct DetailView: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
Button("Pop from Navigation Stack") {
dismiss()
}
}
}
在这个例子中,我们展示了 dismiss
在三种不同情况下的使用:
- 关闭 sheet
- 关闭全屏覆盖
- 从导航堆栈中弹出视图
在每种情况下,我们都使用 @Environment(\.dismiss) private var dismiss
来获取 dismiss
函数,然后在适当的时候调用它。这展示了 dismiss
的通用性和在不同上下文中的一致使用方式。