我正在开发一个两窗格 SwiftUI 应用程序,其中包含侧边栏和详细信息窗格DoubleColumnNavigationView
.
我想开一个NavigationLink
从侧边栏的工具栏进入详细信息窗格,如下面 gif 中的“从侧边栏打开”所示)。
但是,视图会以堆栈形式打开,如下面 gif 中的“从工具栏打开”所示。
Using isDetailLink(true)
似乎没有效果。
struct ContentView: View {
var body: some View {
NavigationView {
List {
NavigationLink(destination: Text("Opened from sidebar")) {
Text("Open from sidebar")
}
}.listStyle(SidebarListStyle())
.navigationTitle("Sidebar")
.toolbar {
ToolbarItem {
// This should open in detail pane
NavigationLink(destination: Text("Opened from toolbar")) {
Text("Open from toolbar")
}
}
}
Text("Detail pane")
}.navigationViewStyle(DoubleColumnNavigationViewStyle())
}
}
通用解决方案
你可能知道,NavigationLink
放在一个时效果不好toolbar
。这里建议的 - 是放置一个Button
into a toolbar
并使用隐藏的NavigationLink
代码中的某处。该按钮告诉链接打开详细信息视图,然后链接执行该操作。这是根据此建议调整的代码:
struct ContentView: View {
/// A state that tracks whether the link in the toolbar should be opened
@State var toolbarLinkSelected = false
var body: some View {
NavigationView {
List {
NavigationLink(destination: Text("Opened from sidebar")) {
Text("Open from sidebar")
}
}.listStyle(SidebarListStyle())
.navigationTitle("Sidebar")
.toolbar {
ToolbarItem {
Button(action: { toolbarLinkSelected = true }) {
Text("Open from toolbar")
}
}
}
.background(
NavigationLink(
destination: Text("Opened from toolbar"),
isActive: $toolbarLinkSelected
) {
EmptyView()
}.hidden() // The link is not visible to user
)
Text("Detail pane")
}.navigationViewStyle(DoubleColumnNavigationViewStyle())
}
}
iOS / iPadOS 唯一解决方案
另外,如果您只需要支持 iOS 和 iPadOS,您可以使用较旧的方法来实现它navigationBarItems
。这在 macOS 上不起作用,因为此修改器不可用,但适用于 iOS/iPadOS。这是示例:
struct ContentView: View {
var body: some View {
NavigationView {
List {
NavigationLink(destination: Text("Opened from sidebar")) {
Text("Open from sidebar")
}
}.listStyle(SidebarListStyle())
.navigationTitle("Sidebar")
.navigationBarItems(trailing: NavigationLink(destination: Text("Opened from toolbar")) {
Text("Open from toolbar")
})
Text("Detail pane")
}.navigationViewStyle(DoubleColumnNavigationViewStyle())
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)