RxSwift使用bindTo绑定变量<String>到UILabel不适用于Swift 3.0更新

Jin*_*nny 13 ios swift swift3

我用RxSwift绑定我viewmodelUILabelUITexfield.UITextfield没有问题转换为Swift 3,只是替换rx_textrx.text工作.

但不是UILabel.在Swift 2.2,我用过:

self.viewModel.shiftNameText.asObservable().bindTo(self.shiftLabel.rx_text).addDisposableTo(self.disposeBag)
Run Code Online (Sandbox Code Playgroud)

因为Swift 3,我正在使用RxSwift3.0.0-beta.1并尝试将rx_text更改为rx.text,但它没有编译并显示此错误"无法转换类型的值"AnyObserver<String?>' (aka 'AnyObserver<Optional<String>>') to expected argument type 'Variable<String>".

有谁知道为什么以及如何使这项工作?谢谢.

小智 35

UILabelrx.text属性的类型的AnyObserver<String?> ,所以你需要将值映射到一个可选

self.viewModel.shiftNameText
    .asObservable()
    .map { text -> String? in 
        return Optional(text)
    }
    .bind(to:self.shiftLabel.rx.text)
    .disposed(by:self.disposeBag)
Run Code Online (Sandbox Code Playgroud)

或简而言之:

self.viewModel.shiftNameText
  .asObservable()
  .map { $0 }
  .bind(to:self.shiftLabel.rx.text)
  .disposed(by:self.disposeBag)
Run Code Online (Sandbox Code Playgroud)

有关其他解决方案,请参阅https://github.com/ReactiveX/RxSwift/issues/875.