Environment|使用 isPresented 获取模态窗口状态
通过使用 isPresented 环境值获取窗口显示状态,并条件判断显示内容。

从 iOS15 开始,你可以使用 dismiss
环境值来关闭模态窗口,无论它是通过何种方式呈现:
private struct SheetContents: View {
@Environment(\.dismiss) private var dismiss
var body: some View {
Button("Done") {
dismiss()
}
}
}
除了 dismiss
以外,还有另一个环境值 isPresented
,可以用于获取窗口展示状态 —— 是否通过模态展示。
仅在模态展示时显示关闭按钮
通过获取 isPresented
环境值,仅当窗口通过模态方式呈现时,isPresented
才用 true
。
private struct SheetContents: View {
@Environment(\.dismiss) private var dismiss
@Environment(\.isPresented) private var isPresented
var body: some View {
NavigationStack{
VStack {
Text("")
}
.toolbar {
// 检查当前视图是否以模态方式呈现,以决定是否显示"完成"按钮
if isPresented {
ToolbarItem(placement: .topBarTrailing) {
Button("完成") {
dismiss()
}
}
}
}
}
}
}
延迟显示关闭按钮
通过延迟显示 toolbar
内容,在某些时候可能用到,例如在 Paywall 页面。
可以通过结合使用一个中间变量来实现:
private struct SheetContents: View {
@Environment(\.dismiss) private var dismiss
@Environment(\.isPresented) private var isPresented
@State private var showDoneButton = false
var body: some View {
NavigationStack{
VStack {
Text("")
}
// 在视图加载时使用Task启动异步延迟
.task {
try? await Task.sleep(for: .seconds(2))
withAnimation {
showDoneButton = true
}
}
.toolbar {
// 检查当前视图是否以模态方式呈现,以决定是否显示"完成"按钮
if isPresented && showDoneButton {
ToolbarItem(placement: .topBarTrailing) {
Button("完成") {
dismiss()
}
}
}
}
}
}
}