0

I have a simple ViewModel:

struct ViewModel {
    var someText = Variable<String>("")

    func foo() -> Observable<String> {
        return someText.asObservable()
    }
}

In the ViewController, viewModel is the instance variable, and someTextField is a UITextField with IBOutlet connected properly

var viewModel = ViewModel()
@IBOutlet weak var someTextField: UITextField!

Then in viewDidLoad() of the ViewController, I set things up and do the following:

someTextField.rx.text.map { $0 ?? "" }.bind(to: viewModel.someText)

let disposeBag = DisposeBag()
let observable = viewMode.foo()
observable.subscribe(onNext: { data in
            print(data)
        }, onError: { error in
            print(error)
        }, onCompleted: {
            print ("complete")
        }, onDisposed: {
            print("disposed")
        }).disposed(by: disposeBag)

As I enter characters in the textfield, I expect print() to print out these characters. But print() is only invoked once in the debugger (and not subsequently when text field receives input)

What is wrong?

christopher.online
  • 2,614
  • 3
  • 28
  • 52
Kevin Le - Khnle
  • 10,579
  • 11
  • 54
  • 80

1 Answers1

2

You have to retain your disposeBag outside the context and the someTextField.rx.text.map { $0 ?? "" }.bind(to: viewModel.someText) should be disposed(by: disposeBag).

Timofey Solonin
  • 1,393
  • 13
  • 20