使用 SwiftUI 的 macOS 应用程序中的导航视图不稳定

Posted

技术标签:

【中文标题】使用 SwiftUI 的 macOS 应用程序中的导航视图不稳定【英文标题】:Erratic navigation view in macOS app with SwiftUI 【发布时间】:2019-08-01 13:43:28 【问题描述】:

我正在尝试使用 SwiftUI 为 macOS 应用程序创建主/详细视图。目标是在侧栏中选择一个项目并相应地更改主视图。我的这个例子的代码如下所示:

import SwiftUI

struct MyMasterView: View 

    let names = ["Homer", "Marge", "Bart", "Lisa"]

    var body: some View 

        List 
            ForEach(names, id: \.self)  name in
                NavigationLink(name, destination: MyDetailView(name: name))
            
        
        .frame(width: 150, height: 300)

    


struct MyDetailView: View 

    var name = "Name"

    var body: some View 

        HStack 
            Text("Hello \(name)")
                .font(.largeTitle)
        
        .frame(width: 450, height: 300)

    


struct ContentView: View 

    var body: some View 

        NavigationView 
            MyMasterView()
            MyDetailView()
        
        .navigationViewStyle(DoubleColumnNavigationViewStyle())
        .frame(width: 600, height: 300)

    

运行 Mac 应用程序时,侧栏选择可能会变为非活动状态,有时会出现弹出视图,而不是更改详细视图。有关该问题的屏幕截图,请参见下文。这是 Mac 上 SwiftUI NavigationView 的一个错误,还是我需要实现一些东西才能使其在 macOS 上工作?

https://youtu.be/BF7m1OszZ5w

【问题讨论】:

【参考方案1】:

从 Xcode 11.0 (11A420a) 和 macOS Catalina (19A558d) 开始,NavigationView 按预期工作:

import SwiftUI

struct DetailView: View 
    let text: String

    var body: some View 
        Text(text)
            .frame(maxWidth: .infinity, maxHeight: .infinity)
    


struct ContentView: View 
    private let names = ["Homer", "Marge", "Bart", "Lisa"]
    @State private var selection: String?

    var body: some View 
        NavigationView 
            List(selection: $selection) 
                Section(header: Text("The Simpsons")) 
                    ForEach(names, id: \.self)  name in
                        NavigationLink(destination: DetailView(text: name)) 
                            Text(name)
                        
                    
                
            .listStyle(SidebarListStyle())
            DetailView(text: "Make a selection")
        
    

【讨论】:

这种方法是否允许侧边栏滚动? 是的,侧边栏可以滚动,但是由于固定的宽度/高度,窗口无法调整大小;希望在下一个测试版中得到修复 您的方法效果很好。希望 SwiftUI 的问题将在未来的 Xcode 版本中得到修复。此外,在示例中,NavigationView 可以替换为 HStackVStack。再次感谢您的帮助。

以上是关于使用 SwiftUI 的 macOS 应用程序中的导航视图不稳定的主要内容,如果未能解决你的问题,请参考以下文章

使用 SwiftUI 在 MacOS 中的多列 TableViews

为啥 macOS 中的 SwiftUI 多行换行文本在 Preview 中有效,但在实际应用中无效?

如何在 SwiftUI 生命周期中删除 macOS 中的最大化、最小化和关闭按钮?

macOS App SwiftUI 中的 ContextMenu 按钮点击

如何在 macOS 上检测 SwiftUI 中的键盘事件?

如何在 macOS 上检测 SwiftUI 中的键盘事件?