NavigationLink не добавляется к пути внутри NavigationSplitView/NavigationStack
Следующий код показывает, что$path
всегда равен 0, несмотря на нажатиеNavigationLink
внутри стека. Это означает, что когда я выбираю панель и нажимаю на ссылку навигации, чтобы перейти к «подпредставлению firstPanel», а затем выбираю новую панель, путь к NavigationStack не сбрасывается.
Если я использую новый.navigationDestination
API тогда работает, но у меня сложилось впечатление, что старая NavigationLink безvalue:
тоже должно работать, поскольку он не устарел. Это на iOS 16.4.
Идеи:
- Я как-то не привязываюсь к $path должным образом
- NavigationStack не понимает свое корневое представление
- Я не думаю, что мне нужен отдельный NavigationStack для каждой панели?
- Может быть, мне нужно везде использовать .navigationDestination? Возможно, предполагается, что эта NavigationLink не изменяет путь стека? Кажется странным. Я вижу более старые версии NavigationLinks в примере приложения FoodTruck.
- Это может быть не связано с NavigationSplitView, а просто с NavigationStack.
import SwiftUI
enum Panel: String, Hashable {
case firstPanel, secondPanel
}
struct ContentView: View {
@State private var selection: Panel? = .firstPanel
@State private var path = NavigationPath()
var body: some View {
NavigationSplitView {
List(selection: $selection) {
NavigationLink(value: Panel.firstPanel) {
Text(Panel.firstPanel.rawValue)
}
NavigationLink(value: Panel.secondPanel) {
Text(Panel.secondPanel.rawValue)
}
}
.listStyle(.sidebar)
.navigationTitle("MyApp")
} detail: {
NavigationStack(path: $path) {
switch selection ?? .firstPanel {
case .firstPanel:
NavigationLink {
Text("This is \(Panel.firstPanel.rawValue) subview") // <-- navigate to here, then tap secondPanel
} label: {
Text("Go to \(Panel.firstPanel.rawValue) subview")
}
case .secondPanel:
NavigationLink {
Text("This is \(Panel.secondPanel.rawValue) subview")
} label: {
Text("Go to \(Panel.secondPanel.rawValue) subview")
}
}
}
}
.onChange(of: selection) { _ in
print(path.count) // <-- always prints 0
path.removeLast(path.count)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.previewDevice("iPad Pro (11-inch) (4th generation)")
.previewInterfaceOrientation(.landscapeLeft)
}
}
Спасибо!
1 ответ
В вашем коде нет ничего, что можно было бы добавить по пути. SwiftUI нужны какие-то данные для добавления в путь. Примеры NaviationLink в документах SwiftUI, которые не используют значение для инициализации, представлены в навигационном стеке без пути.
NavigationStack {
List {
NavigationLink("Mint") { ColorDetail(color: .mint) }
NavigationLink("Pink") { ColorDetail(color: .pink) }
NavigationLink("Teal") { ColorDetail(color: .teal) }
}
.navigationTitle("Colors")
}