"Observable <String>"类型的值没有成员"bind"

pan*_*kaj 3 mvvm swift rx-swift

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

类型'Observable'的值没有成员'bind'我的ViewController中的绑定代码:

self.viewModel.myNum
        .map( { $0 })
        .bind(to: serialNumberLabel.rx.text)
Run Code Online (Sandbox Code Playgroud)

myNum在viewModel中定义如下:

var myNum: Observable<String>
Run Code Online (Sandbox Code Playgroud)

不,我在这里有两个问题:1.ViewController中的错误2.在ViewModel中初始化myNum我尝试了以下初始化myNum,但是我收到错误:

materialNum = Observable<String>("")
Run Code Online (Sandbox Code Playgroud)

kod*_*lit 9

我想你可能会忘记使用import RxCocoa.

对我来说代码有效,但是.map({ $0 })它是多余的,因为它返回的值相同,你当然忘了.disposed(by:)在最后添加:

self.viewModel.myNum
    .bind(to: serialNumberLabel.rx.text)
    .disposed(by:self.disposeBag)
Run Code Online (Sandbox Code Playgroud)

关于初始化你可能会像Valérian所说:

materialNum = Observable.just("My string")
Run Code Online (Sandbox Code Playgroud)

但是如果稍后更改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()
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,不需要上面扩展的活页夹setText,Reactive但在其他情况下可能有用.

然后你可以绑定:

self.viewModel.rx.text
    .bind(to: serialNumberLabel.rx.text)
    .disposed(by:self.disposeBag)
Run Code Online (Sandbox Code Playgroud)


Val*_*ian 1

bind是用于Relays(并且Variable已被弃用!)。

只需使用subscribe

self.viewModel.myNum.subscribe(serialNumberLabel.rx.text)
Run Code Online (Sandbox Code Playgroud)

您需要使用现有方法之一来创建可观察对象:

materialNum = Observable.just("My string")
Run Code Online (Sandbox Code Playgroud)