SwiftUI:在 macOS NavigationView 中关闭视图

Posted

技术标签:

【中文标题】SwiftUI:在 macOS NavigationView 中关闭视图【英文标题】:SwiftUI: Dismiss View Within macOS NavigationView 【发布时间】:2020-04-09 04:53:32 【问题描述】:

详细here(关于 ios 主题),以下代码可用于使 SwiftUI View 自行关闭:

@Environment(\.presentationMode) var presentationMode
// ...
presentationMode.wrappedValue.dismiss()

但是,此方法不适用于本机(非 Catalyst)macOS NavigationView 设置(如下所示),其中所选视图显示在 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()
    

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

【问题讨论】:

为了以防万一,推荐的主题是针对 iOS 的。 是的,注意到了,谢谢。希望大多数 SwiftUI 功能都适用于这两种情况,但这似乎不是其中一种情况。我想我看到 cmets 建议它也不适用于 iPadOS 拆分视图,但我不确定第一手。 我现在也在问题中明确说明了操作系统差异。 @TheNeil 任何想法,同时如何在 MacOS 中解决这个问题? 嗨@mica。很不幸的是,不行。还没有看到任何答案进来这个。老实说,我主要是通过使用更多条件视图并远离导航视图来解决它,但这远非理想。 【参考方案1】:

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

查看苹果https://developer.apple.com/tutorials/swiftui/creating-a-macos-app给出的例子

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

    创建一个新的模态窗口(This is more complicated) 使用工作表。

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

struct HelpView: View 
    @State private var showModal = false
    var body: some View 
        NavigationView 
            List 
                NavigationLink(destination:
                    VStack 
                        Button("About") self.showModal.toggle() 
                        Text("Here’s a User Guide")
                    
                ) 
                    Text("User Guide")
                
            
        
        .sheet(isPresented: $showModal) 
            AboutAppView(showModal: self.$showModal)
        
    


struct AboutAppView: View 
    @Binding var showModal: Bool
    public var body: some View 
        Button(action: 
            self.showModal.toggle()
        ) 
            Text("Dismiss Me!")
        
    

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

【讨论】:

以上是关于SwiftUI:在 macOS NavigationView 中关闭视图的主要内容,如果未能解决你的问题,请参考以下文章

带有 SidebarListStyle 的 SwiftUI 列表没有圆角?

(SwiftUI, MacOS 11.0) 如何在 SecureTextFeild 中检测焦点?

SwiftUI - 在 macOS 上翻转全局坐标空间

SwiftUI - 如何在 macOS 上隐藏窗口标题

SwiftUI:WKWebView 在 macOS 上截断页面内容(NSViewRepresentable)

SwiftUI:如何在 macOS 11 上使用 NSSearchToolBarItem?