I've been struggling with this, and user state controlled navigationlink is still not working correctly in Xcode 14.5.1.
I have some views with almost identical functionality, some work, some do not.
What I have discovered is that the views that are the first level of the Navigation stack do not work correctly, but those further down for some reason do work correctly.
NavigationView -> View (with User State Links) // DOES NOT WORK
NavigationView -> NavigationLink -> View (with User State Links) // WORKS
This code demonstrates the problem, and how I have managed to get it working for now by wrapping the view in a container link.
import SwiftUI
let data = ["Item A", "Item B", "Item C"]
struct ContentView: View {
var body: some View {
TabView {
FirstTabView().tabItem {
Image(systemName: "1.circle.fill")
Text("Not working")
}
SecondTabContainerView().tabItem {
Image(systemName: "2.circle.fill")
Text("Working")
}
}
}
}
// First Tab View ** NOT WORKING **
struct FirstTabView: View {
@State private var showingDetailView = false
var body: some View {
NavigationView {
List {
ForEach(data, id: \.self) { data in
NavigationLink(destination: DetailView(data: data)) {
Text(data)
}
}
}
.navigationBarItems(trailing: Button(action: {
showingDetailView = true
}) { Text("Next Page") })
NavigationLink(destination: DetailView(data: "Next Page"), isActive: $showingDetailView) {
EmptyView()
}
}
}
}
struct DetailView: View {
var data: String
var body: some View {
Text(data)
}
}
// Second Tab Views ** WORKING **
struct SecondTabContainerView: View {
@State private var showingDetailView = true
var body: some View {
NavigationView {
NavigationLink(destination: SecondTabView(), isActive: $showingDetailView) { EmptyView() }
}
}
}
struct SecondTabView: View {
@State private var showingDetailView = false
var body: some View {
List {
ForEach(data, id: \.self) { data in
NavigationLink(destination: DetailView(data: data)) {
Text(data)
}
}
}
.listStyle(InsetGroupedListStyle())
.navigationBarItems(trailing: Button(action: {
showingDetailView = true
}) { Text("Next Page") })
.navigationBarBackButtonHidden(true)
NavigationLink(destination: DetailView(data: "Next Page"), isActive: $showingDetailView) {
EmptyView()
}
}
}
Topic:
UI Frameworks
SubTopic:
SwiftUI
Tags: