我正在尝试使用SwiftUI在macOS上创建主视图/详细视图。当主视图/局部视图首次呈现时,我希望它立即“突出显示” /“导航到”其第一个条目。
换句话说,我想立即呈现以下内容:master/detail first row highlighted
我在macOS上使用NavigationView
和NavigationLink
渲染主视图/详细视图:
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
提供的isActive
和tag
/ selection
选项,但都没有运气。我在这里可能会缺少什么?有没有办法使用SwiftUI强制将注意力集中在第一个master / detail元素上?
答案 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()
}
}
}
}