Search code examples
swiftuicombine

SwiftUI pop view upon observable event


I am trying to pop a SwiftUI view upon a particular event from an observed object. How can I do this? This code does not work because I can't refer to self inside the sink method.

struct MyView: View {
  @Environment(\.presentationMode) var presentationMode
  @ObservedObject var observable: MyObservable

  init() {
    observable.$state.sink { state in    // !! Escaping closure captures mutating 'self' parameter !!
      presentationMode.wrappedValue.dismiss()
    }
  }
}

Solution

  • You don't need publisher here and definitely should not do this in init because at least environment is not available there (even you'd solve all others errors).

    You just need to observe changes of state in regular way, like below

    var body: some View {
        Text("Some view here")
            .onChange(of: observable.state) { newState in
                // depending on newState your decision here
                presentationMode.wrappedValue.dismiss()
            }
    }