【问题标题】:Value of type 'Observable<String>' has no member 'bind''Observable<String>' 类型的值没有成员 'bind'
【发布时间】:2018-07-12 16:33:58
【问题描述】:

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

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

self.viewModel.myNum
        .map( { $0 })
        .bind(to: serialNumberLabel.rx.text)

myNum 在 vi​​ewModel 中定义如下:

var myNum: Observable<String>

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

materialNum = Observable<String>("")

【问题讨论】:

    标签: swift mvvm rx-swift


    【解决方案1】:

    我想你可能会忘记使用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 项目并查看他们的 Playground。

    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()
        }
    }
    

    上述Reactive 扩展中的Binder setText 在您的情况下不是必需的,但在其他情况下可能有用。

    然后就可以绑定了:

    self.viewModel.rx.text
        .bind(to: serialNumberLabel.rx.text)
        .disposed(by:self.disposeBag)
    

    【讨论】:

    • 嗨,感谢您的帮助,是的,我现在可以运行它,但我的 serialNumberLabel 中没有数据
    • 我使用 Observable.just 将数据从 ViewModel 发送到标签,您是否建议我使用其他任何东西然后映射?
    • @pankaj, Observable.just("My string") 只是一个例子,“just() 接受一个参数并将其作为next 发送,然后它在下一个之后发送completed” (source) ,也许你在observable返回值之后改变那个值,如果你的值不会及时改变我建议硬编码它,如果它会改变你应该分配给materialNum更复杂的observable,它会生成适当的文本,或者您可以使用 PublishSubjectVariable 从 ViewModel 更改文本。
    • 好的,这可能是它没有监听我的变量的所有更改的原因。因此,如果我使用 PublishSubject,我是否能够在 ViewModel 中监听我的变量的所有更改?您也可以分享一个与我的要求类似的 PublishSubject 示例。
    • 关于map 我只是认为那里不需要地图,因为您没有将 myNum 返回的值转换为那里的任何其他值,而是将值映射到相同的值.您的 map 只是获取 myNum 并再次返回它。干什么用的?
    【解决方案2】:

    bind 用于 Relays(和 Variable 已弃用!)。

    只需使用subscribe

    self.viewModel.myNum.subscribe(serialNumberLabel.rx.text)
    

    您需要使用现有方法之一来创建您的 observable:

    materialNum = Observable.just("My string")
    

    【讨论】:

    • 绑定到 rx.text 没有问题 - 它适用于任何 ObserverType,rx.text 是一个 ControlProperty,是一个 :)
    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 2016-12-03
    • 2019-08-21
    • 2019-02-03
    • 2016-06-08
    • 2017-02-14
    • 2018-03-14
    • 2019-07-25
    相关资源
    最近更新 更多