NavigationLink не добавляется к пути внутри NavigationSplitView/NavigationStack

Следующий код показывает, что$pathвсегда равен 0, несмотря на нажатиеNavigationLinkвнутри стека. Это означает, что когда я выбираю панель и нажимаю на ссылку навигации, чтобы перейти к «подпредставлению firstPanel», а затем выбираю новую панель, путь к NavigationStack не сбрасывается.

Если я использую новый.navigationDestinationAPI тогда работает, но у меня сложилось впечатление, что старая 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")
}
Другие вопросы по тегам