Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SwiftUI pass binding through NavigationStack enum

Tags:

swiftui

I am attempting to pass a Binding through my NavigationStack enum into my View. I'm not sure if I can pass Binding into an enum, if I cannot then how should I go about this. Thanks in advance!

@available(iOS 16.0, *)
enum Route: Hashable, Equatable {
    //ERROR HERE: Not sure how to get Binding in enum or if possible
    case gotoBView(input: Binding<String>)
    @ViewBuilder
    func view(_ path: Binding<NavigationPath>) -> some View{
        switch self {
        case .gotoBView(let input): BView1(bvar: input)
        }
    }
    var isEmpty: Bool {
        return false
    }
}
//START VIEW
@available(iOS 16.0, *)
struct ContentView25: View {
    @State var input = "Hello"
    @State var path: NavigationPath = .init()
    var body: some View {
        NavigationStack(path: $path){
            NavigationLink(value: Route.gotoBView(input: $input), label: {Text("Go To A")})
            .navigationDestination(for: Route.self){ route in
                route.view($path)
            }
        }
    }
}
//View to navigate to with binding
@available(iOS 16.0, *)
struct BView1: View {
    @Binding var bvar: String
    var body: some View {
        Text(bvar)
    }
}
like image 387
micah Avatar asked Jan 24 '26 14:01

micah


1 Answers

Here is a workaround, in previous iOS versions this has dismissed the NavigationLink, In iOS 16.2 it does not behave this way, I would do extensive testing before using this in a production app.

import SwiftUI
@available(iOS 16.0, *)
enum Route: Hashable, Equatable {
    case gotoBView(input: Binding<String>)
    @ViewBuilder
    func view(_ path: Binding<NavigationPath>) -> some View{
        switch self {
        case .gotoBView(let input): BView1(bvar: input)
        }
    }
    //Create a custom implementation of Hashable that ignores   Binding
    func hash(into hasher: inout Hasher) {
        switch self {
        case .gotoBView(let input):
            hasher.combine(input.wrappedValue)
        }
    }
    //Create a custom implementation of Equatable that ignores   Binding
    static func == (lhs: Route, rhs: Route) -> Bool {
        return lhs.hashValue == rhs.hashValue
    }
    
}

SwiftUI is all about identity and NavigationPath uses Hashable and Equatable to function. This bypasses SwiftUI's implementation.

like image 71
lorem ipsum Avatar answered Jan 28 '26 05:01

lorem ipsum



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!