Context
我对新的 SwiftUI 有疑问SideBar
/ NavigationLink
概念。
我创建了一个简单的2 Column NavigationSplitView
with a SideBar
and a DetailView
.
应用程序启动后,预选的Timeline RootView
显示为DetailView
。然而,当我选择不同的SideBar Item
, the DetailView
不会相应改变。
Code
struct SideBar: View {
@State private var navigationItem: NavigationItem? = .timeline
var body: some View {
NavigationSplitView {
List(NavigationItem.allCases, id: \.self, selection: $navigationItem) { navigationItem in
NavigationLink(value: navigationItem) {
Label(navigationItem.name, systemImage: navigationItem.symbol)
}
}
} detail: {
if let safeNavigationItem = navigationItem {
safeNavigationItem.rootView
} else {
Text(String(localized: "select.an.option", defaultValue: "Select an Option"))
}
}
}
}
enum NavigationItem: CaseIterable {
case item1
case item2
case item3
case item4
var name: String {
switch self {
case .item1: return "Item 1"
case .item2: return "Item 2"
case .item3: return "Item 3"
case .item4: return "Item 4"
}
}
var symbol: String {
switch self {
case .item1: return "1.square.fill"
case .item2: return "2.square.fill"
case .item3: return "3.square.fill"
case .item4: return "4.square.fill"
}
}
@ViewBuilder var rootView: some View {
switch self {
case .item1: Text("Item 1")
case .item2: Text("Item 2")
case .item3: Text("Item 3")
case .item4: Text("Item 4")
}
}
}
Question
您知道我该如何解决这个问题吗?非常感谢您提前的支持。
Note:刚刚在 macOS 上运行它,它在那里工作。但是,仍然无法在 iPadOS 上运行。
看起来他们忘记了(或者坏了)ViewBuilder
for detail:
部分。值得向苹果提交反馈。
一个安全的解决方法是将条件块包装到某个堆栈中,例如
} detail: {
VStack { // << here !!
if let safeNavigationItem = navigationItem {
safeNavigationItem.rootView
} else {
Text(String(localized: "select.an.option", defaultValue: "Select an Option"))
}
}
}
使用 Xcode 14b3 / iOS 16 进行测试
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)