This was not intended to be the top answer here - but rather an alternative method if you didn't want the navigation bar. See Jake's answer below for the normal way to do this with NavigationView
& NavigationLink
. Hopefully this is still useful or points you in the right direction too.
If you are just trying to get a NavigationLink
working with a Binding
, you can use the same NavigationLink
init I did with the isActive
binding parameter.
Anyway, back to the answer…
I made a view modifier for this. It also means that there is no navigation bar. You can call it like so:
.navigate(to: MainPageView(), when: $willMoveToNextScreen)
This can be attached to anything, so I typically attach it to the end of the body, for example:
@State private var willMoveToNextScreen = false
var body: some View {
VStack {
/* ... */
}
.navigate(to: MainPageView(), when: $willMoveToNextScreen)
}
Code (remember to import SwiftUI
):
extension View {
/// Navigate to a new view.
/// - Parameters:
/// - view: View to navigate to.
/// - binding: Only navigates when this condition is `true`.
func navigate<NewView: View>(to view: NewView, when binding: Binding<Bool>) -> some View {
NavigationView {
ZStack {
self
.navigationBarTitle("")
.navigationBarHidden(true)
NavigationLink(
destination: view
.navigationBarTitle("")
.navigationBarHidden(true),
isActive: binding
) {
EmptyView()
}
}
}
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…