NavigationLink
is what we should define in a scope enclosed inside a NavigationView
.
But when we use NavigationLink
it is attached to the enclosing view, so to reuse the same NavigationLink
with other views, we use tag
which differentiates between different Destinations.
struct SwiftUIView: View {
@State private var viewState: Int? = 0
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: Text("View 1"), tag: 1, selection: $viewState) {
EmptyView()
}
NavigationLink(destination: Text("View 2"), tag: 2, selection: $viewState) {
EmptyView()
}
Text("First View")
.onTapGesture {
self.viewState = 1
}
Text("Second View")
.onTapGesture {
self.viewState = 2
}
}
}
}
}
Here we bind a Hashable
property with all the NavigationLinks
present in our VStack
so that when a particular View is tapped we can notify which Destination should be opened by setting the value of Bindable
property.
If we don't notify the correct Destination by setting the value of tag
, always the View defined inside the Closure of NavigationLink
will be clickable and nothing else.
Using this approach you don't need to wrap all your clickable views inside NavigationView
, any action on any view can use any NavigationLink
just by setting the tag
.
Thanks, hope this helps.