我正在尝试将ViewModel中的字符串值绑定到我的ViewController中的标签,但我收到以下错误:
类型的值'可观察的'没有会员' bind' 我在ViewController中的绑定代码:
self.viewModel.myNum
.map( { $0 })
.bind(to: serialNumberLabel.rx.text)
myNum在viewModel中定义如下:
var myNum: Observable<String>
不,我有2个问题: 1. ViewController中的上述错误 2.在ViewModel中初始化myNum 我试着跟随初始化myNum,但我收到错误:
materialNum = Observable<String>("")
答案 0 :(得分:7)
我认为您可能忘记使用import RxCocoa
。
对我来说代码有效,但.map({ $0 })
是多余的,因为它会返回相同的值,而您当然忘记在最后添加.disposed(by:)
:
self.viewModel.myNum
.bind(to: serialNumberLabel.rx.text)
.disposed(by:self.disposeBag)
关于初始化你可能会像Valérian所说的那样:
materialNum = Observable.just("My string")
但如果稍后更改observable,则需要再次绑定标签文本。
编辑:示例(作者请求)
@pankaj,我建议你从GitHub下载RxSwift项目并查看他们的游乐场。
import RxSwift
import RxCocoa
class MyViewModel: ReactiveCompatible {
fileprivate lazy var _text = BehaviorRelay<String>(value: "My Initial Text")
var text: String {
get { return _text.value }
set { _text.accept(newValue) }
}
}
extension Reactive where Base: MyViewModel {
var text:Observable<String> {
return base._text.asObservable()
}
var setText: AnyObserver<String> {
return Binder<String>(base, binding: { viewModel, value in
viewModel.text = value
}).asObserver()
}
}
您的案例中不需要setText
扩展名中的Reactive
,但在其他情况下可能会有用。
然后你可以绑定:
self.viewModel.rx.text
.bind(to: serialNumberLabel.rx.text)
.disposed(by:self.disposeBag)
答案 1 :(得分:0)
bind
适用于Relays
(以及Variable
已弃用!)。
只需使用subscribe
self.viewModel.myNum.subscribe(serialNumberLabel.rx.text)
您需要使用现有方法之一来创建您的observable:
materialNum = Observable.just("My string")