Environment|使用 isPresented 获取模态窗口状态

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

Environment|使用 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()
                        }
                    }
                }
            }
        }
    }
}