SwiftUI macOS NavigationView无法突出显示第一个条目

时间:2020-01-12 19:27:44

标签: swift macos swiftui swiftui-navigationlink

我正在尝试使用SwiftUI在macOS上创建主视图/详细视图。当主视图/局部视图首次呈现时,我希望它立即“突出显示” /“导航到”其第一个条目。

换句话说,我想立即呈现以下内容:master/detail first row highlighted

我在macOS上使用NavigationViewNavigationLink渲染主视图/详细视图:

struct ContentView: View {

  var body: some View {
    NavigationView {
      List {
        NavigationLink(destination: Text("detail-1").frame(maxWidth: .infinity, maxHeight: .infinity)) {
          Text("link-1")
        }
        NavigationLink(destination: Text("detail-2").frame(maxWidth: .infinity, maxHeight: .infinity)) {
          Text("link-2")
        }
      }
    }
  }
}

我尝试同时使用NavigationLink提供的isActivetag / selection选项,但都没有运气。我在这里可能会缺少什么?有没有办法使用SwiftUI强制将注意力集中在第一个master / detail元素上?

1 个答案:

答案 0 :(得分:0)

我最近遇到了这个问题,在卡住同一点后,我发现Apple's tutorial表示您在macOS上不使用NavigationLink

相反,您只需使用NavigationView和DetailView创建一个List。然后,您可以绑定List的选择,它可以正常工作。

高亮部分似乎仍然有错误。解决方法是在NavigationView出现后的下一个运行循环中设置选择。 :/

这是一个完整的例子:

enum DetailContent: Int, CaseIterable, Hashable {
    case first, second, third
}
extension DetailContent: Identifiable {
    var id: Int { rawValue }
}

struct DetailView: View {
    @Binding var content: DetailContent?

    var body: some View {
        VStack {
            Text("\(content?.rawValue ?? -1)")
        }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}

struct MainView: View {
    @State var detailContent: DetailContent?

    var body: some View {
        NavigationView {
            List(selection: $detailContent) {
                Section(header: Text("Section")) {
                    ForEach(DetailContent.allCases) { item in
                        Text("\(item.rawValue)")
                            .tag(item)
                    }
                }
            }
                .frame(minWidth: 250, maxWidth: 350)
                .listStyle(SidebarListStyle())
            if detailContent != nil {
                DetailView(content: $detailContent)
            }
        }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .onAppear {
                DispatchQueue.main.async {
                    self.detailContent = DetailContent.allCases.randomElement()
                }
            }
    }
}