Search code examples
buttonmvvmswiftuistateviewmodel

SwiftUI: How to update button state from view model


I want to enable and disable another button by updating the state variable in my view model. However, the other button is not activated. What am I doing wrong?

This is my code:

struct ContentView: View {
@State var viewModel = ViewModel()


var body: some View {
    VStack {
        Button(action: {
            viewModel.enableButton()
        }){
            Text("Activate other button")
        }
        
        Button(action: {
            /// code
        }){
            Text("To be activated...")
        }.disabled(viewModel.buttonDisabled)
    }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

class ViewModel: ObservableObject {

    @State var buttonDisabled = true

    func enableButton() {
       buttonDisabled = false
    }

}

Solution

  • Small mistake. You are supposed to use @Published in your view model and @ObservedObject in your view.

    Modified code:

    struct ContentView: View {
    @ObservedObject var viewModel = ViewModel() //modified
    
    var body: some View {
    VStack {
        Button(action: {
            viewModel.enableButton()
        }){
            Text("Activate other button")
        }
        
        Button(action: {
            /// code
        }){
            Text("To be activated...")
        }.disabled(viewModel.buttonDisabled)
    }
    }
    }
    
    class ViewModel: ObservableObject {
    
    @Published var buttonDisabled = true //modified
    
    func enableButton() {
       buttonDisabled = false
    }
    
    }