Problem mit navigationDestination im NavigationStack von SwiftUI 4

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.3.2023 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Problem mit navigationDestination im NavigationStack von SwiftUI 4

    Hallo in die Runde!

    Mal eine Frage in die Runde an die, die sich schon die Neuerungen von SwiftUI 4 anschauen. Als große Neuerung gibt es da ja jetzt den NativigationStack und NavigationDestination, was die Navigation erheblich vereinfacht. Blöderweise funktioniert eine Variante davon seit der gestrigen Beta 4 nicht mehr:

    C-Quellcode: ContentView.swift

    1. struct ContentView: View {
    2. enum Route: Hashable {
    3. case one
    4. case two
    5. }
    6. var body: some View {
    7. NavigationSplitView {
    8. NavigationLink("Target One", value: Route.one)
    9. NavigationLink("Target Two", value: Route.two)
    10. } detail: {
    11. NavigationStack {
    12. Text("Home")
    13. }
    14. .navigationDestination(for: Route.self) { route in
    15. switch route {
    16. case .one:
    17. Text("Target for Route One")
    18. case .two:
    19. Text("Target for Route Two")
    20. }
    21. }
    22. }
    23. }
    24. }
    Alles anzeigen
    Damit sollte beim Klick auf NavigationLink eigentlich die Views „Target for Route One“ und „Two“ geöffnet werden. Stattdessen kommt aber nur dieser Fehler:

    A NavigationLink is presenting a value of type “Route” but there is no matching navigation destination visible from the location of the link. The link cannot be activated.

    Sieht irgendjemand einen Fehler im Code oder hat eine Idee, warum angeblich kein passendes Ziel gefunden wird? In iOS 16 Beta 3 und Xcode 14 Beta 3 hat das noch so funktioniert.

    PS: Ich hab es natürlich schon Apple gemeldet aber erfahrungsgemäß gibt es da kaum Antworten und vielleicht habe ich ja auch nur einen Denkfehler, der nur zufälligerweise früher funktioniert hat. :/
    So Long, and Thanks for All the Fish.
  • Ich hab es selbst ehrlich gesagt noch nicht groß in der Praxis ausprobiert und kann dir daher leider nur bedingt helfen. Aber spontan beim Überfliegen deines Codes fällt mir auf, dass du die NavigationLinks in der NavigationSplitView verwendest, die Destination allerdings als Modifier des NavigationStacks definierst - kann evtl. am falschen Scope der Fehler liegen? Aber wie gesagt, das ist völlig ins Blaue. Kannst du es mal wie folgt ausprobieren?

    Quellcode

    1. struct ContentView: View {
    2. enum Route: Hashable {
    3. case one
    4. case two
    5. }
    6. var body: some View {
    7. NavigationSplitView {
    8. NavigationLink("Target One", value: Route.one)
    9. NavigationLink("Target Two", value: Route.two)
    10. } detail: {
    11. NavigationStack {
    12. Text("Home")
    13. }
    14. }.navigationDestination(for: Route.self) { route in
    15. switch route {
    16. case .one:
    17. Text("Target for Route One")
    18. case .two:
    19. Text("Target for Route Two")
    20. }
    21. }
    22. }
    23. }
    Alles anzeigen
  • Nein, so funktioniert es leider auch nicht. Ich habe beim Ausprobieren deiner Variante aber noch etwas weiter gesucht und jetzt die Lösung gefunden. Die navigationDestination muss jetzt innerhalb vom NavigationStack gesetzt werden. Bei den Betas davor ging es auch noch außerhalb.

    So funktioniert es:

    C-Quellcode

    1. struct ContentView: View {
    2. enum Route: Hashable {
    3. case one
    4. case two
    5. }
    6. var body: some View {
    7. NavigationSplitView {
    8. List {
    9. NavigationLink("Target One", value: Route.one)
    10. NavigationLink("Target Two", value: Route.two)
    11. }
    12. } detail: {
    13. NavigationStack {
    14. Text("Home")
    15. .navigationDestination(for: Route.self) { route in
    16. switch route {
    17. case .one:
    18. Text("Target for Route One")
    19. case .two:
    20. Text("Target for Route Two")
    21. }
    22. }
    23. }
    24. }
    25. }
    26. }
    Alles anzeigen
    PS: Wie machst du eigentlich den Swift-Quellcode mit Syntax-Highlighting hier im Forum?
    So Long, and Thanks for All the Fish.
  • Ah, typische Fallstrippe, über die ich z.B. beim .navigationTitle (muss ebenfalls innerhalb deklariert werden, nicht außerhalb) auch immer mal wieder stolpere. ;)

    Babelfisch schrieb:

    PS: Wie machst du eigentlich den Swift-Quellcode mit Syntax-Highlighting hier im Forum?
    Das macht es glaube ich ganz automatisch, ich hab es einfach in den Code-Editor eingefügt. Wird bei mir aber auch bei deinem Code-Posting mit korrektem Highlighting angezeigt.