SwiftUI:关闭 macOS NavigationView 中的视图

The*_*eil 6 navigation macos swift swiftui

详见这里(在iOS话题),下面的代码可以用来做SwiftUIView解雇本身:

@Environment(\.presentationMode) var presentationMode
// ...
presentationMode.wrappedValue.dismiss()
Run Code Online (Sandbox Code Playgroud)

但是,这种方法不适用于本机(非 Catalyst)macOSNavigationView设置(如下所示),其中所选视图显示在List.

理想情况下,当这些子视图中的任何一个使用上述内容时,列表将返回到没有选择任何内容(就像它第一次启动时一样);然而,dismiss 函数似乎什么也没做:视图保持完全相同。

这是错误还是预期的 macOS 行为?

是否有另一种方法可以替代?

struct HelpView: View {

    var body: some View {

        NavigationView {
            List {
                NavigationLink(destination:
                    AboutAppView()
                ) {
                    Text("About this App")
                }
                NavigationLink(destination:
                    Text("Here’s a User Guide")
                ) {
                    Text("User Guide")
                }
            }
        }
    }
}

struct AboutAppView: View {

    @Environment(\.presentationMode) var presentationMode

    public var body: some View {
        Button(action: {
            self.dismissSelf()
        }) {
            Text("Dismiss Me!")
        }
    }

    private func dismissSelf() {
        presentationMode.wrappedValue.dismiss()
    }
}
Run Code Online (Sandbox Code Playgroud)

仅供参考:真正的意图是针对不太直接的场景(例如从Alert任务完成时触发);这里的按钮设置只是为了简单起见。

Nik*_*Jon 2

这里的解决方案很简单。不要在需要关闭视图的地方使用导航视图。

\n\n

检查Apple给出的示例https://developer.apple.com/tutorials/swiftui/creating-a-macos-app

\n\n

如果您需要可关闭的视图,有两种方法。

\n\n
    \n
  1. 创建一个新的模态窗口(这个比较复杂)
  2. \n
  3. 使用片材。
  4. \n
\n\n

以下是 macOS 中使用 SwiftUI 的实现表

\n\n
struct HelpView: View {\n    @State private var showModal = false\n    var body: some View {\n        NavigationView {\n            List {\n                NavigationLink(destination:\n                    VStack {\n                        Button("About"){ self.showModal.toggle() }\n                        Text("Here\xe2\x80\x99s a User Guide")\n                    }\n                ) {\n                    Text("User Guide")\n                }\n            }\n        }\n        .sheet(isPresented: $showModal) {\n            AboutAppView(showModal: self.$showModal)\n        }\n    }\n}\n\nstruct AboutAppView: View {\n    @Binding var showModal: Bool\n    public var body: some View {\n        Button(action: {\n            self.showModal.toggle()\n        }) {\n            Text("Dismiss Me!")\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

还有第三个选项,使用 ZStack 在 RootView 中创建模态卡并更改不透明度以显示和隐藏动态数据。

\n