Home > other >  How to bind a @publish datamodel in SwiftUI?
How to bind a @publish datamodel in SwiftUI?

Time:02-01

Is there any way to bind a data model in swiftui?

I have coded like below and need to build a struct so that I can use it in multiple views but the problem is to know how to bind a @publish data model in swiftui?

var birds: [PlayerItem] = [PlayerItem(id: UUID(), playershow: false)]
var dogs: [PlayerItem] = [PlayerItem(id: UUID(), playershow: true)]

class Controller: ObservableObject {
    @Published var bird = birds
    @Published var dog = dogs
}

struct PlayerItem: Hashable {
    var id = UUID()
    var playerShow: Bool
}

struct ContentView: View {
    @EnvironmentObject var control: Controller

    var body: some View {
        setButton(isOn: $Controller.bird)
    }
}

struct setButton: View {
    @Binding var isOn: [PlayerItem]

    var body: some View {
        Button(action: {
            self.isOn[0].toggle()
        }) {
            Text(isOn[0] ? "Off" : "On")
        }
    }
}

I wrote the following code:
@Binding var isOn: [PlayerItem]

However, it complained the following:
Value of type 'EnvironmentObject<controller>.Wrapper' has no dynamic member 'isOn' using the key path from the root type 'Controller'

CodePudding user response:

try the following code, it shows how to use @Binding and how you have to use playershow

class Controller: ObservableObject {
    @Published var bird = [Playeritem(id: UUID(), playershow: false)]
    @Published var dog = [Playeritem(id: UUID(), playershow: true)]
}

struct Playeritem: Hashable {
    var id = UUID()
    var playershow: Bool
}

struct ContentView: View {
    @StateObject var control = Controller() // <-- for testing

    var body: some View {
        setButton(isOn: $control.bird) // <-- here control
    }

}

struct setButton: View {
    @Binding var isOn: [Playeritem]

    var body: some View {
        Button(action: {
            self.isOn[0].playershow.toggle() // <-- here playershow
        }) {
            Text(isOn[0].playershow ? "Off" : "On") // <-- here playershow
        }
    }
}
  •  Tags:  
  • Related