类型值<#39; Observable <string>&#39;没有会员&#39; bind&#39;

时间:2018-02-02 07:59:30

标签: swift mvvm rx-swift

我正在尝试将ViewModel中的字符串值绑定到我的ViewController中的标签,但我收到以下错误:

  

类型的值&#39;可观察的&#39;没有会员&#39; bind&#39;   我在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>("")

2 个答案:

答案 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")