【问题标题】:NavigationLink on macOS not opening in the same ViewmacOS 上的 NavigationLink 未在同一视图中打开
【发布时间】:2021-04-10 11:08:20
【问题描述】:

我目前正在使用 SwiftUI(无 Catalyst)构建一个 macOS 应用程序,它应该有一个侧边栏和一个右侧的视图。

NavigationView {
    List {
        ...
    }
    .listStyle(SidebarListStyle())

    HomeView()
}

我的主页视图中有一个NavigationLink,指向另一个DetailView

struct HomeView: View {
    var body: some View {
        NavigationLink("DetailView", destination: Text("This is the DV"))
    }
}

此 NavigationLink 始终显示为已禁用,并且仅在我将另一列添加到 NavigationView 时才有效。我不想要另一个专栏,而是将NavigationLink 替换 HomeViewDetailView

有什么办法可以做到吗?

【问题讨论】:

  • 我相信有一个错误阻止它正常工作。当我尝试这样做时,新窗口总是以小覆盖打开。我已经在 6 月底的早期 beta 测试期间向苹果提交了错误报告,但没有得到任何反馈。我建议您也向苹果提交反馈。

标签: swift macos swiftui swiftui-navigationlink


【解决方案1】:

显然 SwiftUI 2 还不支持将视图推送到 macOS 上的导航堆栈。但是,我发现这个包有助于解决这个问题:

github.com/lbrndnr/StackNavigationView

【讨论】:

    【解决方案2】:

    NavigationLinks 总是从导航视图的当前“列”打开详细视图,因此如果您的导航链接呈现为 HomeView 的子视图,那么它将尝试作为 HomeView 的详细视图打开(缺少的第三列)。如果您想要一个视图以预期的方式替换 HomeView,那么用户应该从列表中选择一些东西。如果您尝试以编程方式选择列表中已存在的 NavigationLink,则应通过更改绑定到列表选定项的变量的 HomeView 中的状态或列表中的 NavigationLink 选择来实现。这是一个完整的工作示例,它在新 MacOS SwiftUI Xcode 项目的 ContentView.swift 中完成

    struct HomeView: View {
        @Binding var selectedItem: String?
        
        var body: some View {
            Button("Hello") {
                selectedItem = "Thing2"
            }
        }
    }
    
    struct ContentView: View {
        @State private var selectedItem: String?
        private let items = ["Thing1", "Thing2"]
        
        var body: some View {
            NavigationView {
                List(selection: $selectedItem) {
                    ForEach(items, id: \.self) {item in
                        NavigationLink(
                            destination: Text(item),
                            tag: item,
                            selection: $selectedItem
                        ) {
                            Text(item)
                        }
                    }
                }
                HomeView(selectedItem: $selectedItem)
            }
        }
    }
    

    这是显示 HomeView 的应用程序

    这是按下按钮后显示所选内容的应用程序

    如果您不想在导航视图后显示列表中选择的任何内容,但仍想使用导航链接来保持 NavigationView 中导航的完整性,那么您可以在技术上将隐藏的导航链接放在列表

    NavigationView {
                List(selection: $selectedItem) {
                    ForEach(items, id: \.self) {item in
                        NavigationLink(
                            destination: Text(item),
                            tag: item,
                            selection: $selectedItem
                        ) {
                            Text(item)
                        }
                    }
                    NavigationLink(
                        destination: Text("Sneaky"),
                        tag: "Sneaky",
                        selection: $selectedItem
                    ) {
                        Text("")
                    }.hidden()
                }
                HomeView(selectedItem: $selectedItem)
            }
    

    在这种情况下,请确保您的按钮也选择了偷偷摸摸的目标链接

    Button("Hello") {
      selectedItem = "Sneaky"
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多