RxSwift:将 RX 绑定添加到 UITextField 时出错:“Binder<String?>”类型的值没有成员“debounce”

Posted

技术标签:

【中文标题】RxSwift:将 RX 绑定添加到 UITextField 时出错:“Binder<String?>”类型的值没有成员“debounce”【英文标题】:RxSwift: Error adding RX bind to UITextField: Value of type 'Binder<String?>' has no member 'debounce' 【发布时间】:2019-12-01 22:41:16 【问题描述】:

我正在尝试向 UITextField 添加延迟,但出现以下错误:

Property 'text' requires that 'UITextField' inherit from 'UILabel'
Value of type 'Binder<String?>' has no member 'debounce'

这是我的实现:

   func bind() 
        (myTextField.rx.text.debounce(0.5, scheduler: MainScheduler.instance) as AnyObject)
            .map 
                if  $0 == ""
                    return "Type your name bellow"
                else 
                    return "Hello, \($0 ?? "")."
                
        
        .bind(to: myLbl.rx.text)
        .disposed(by: disposeBag)
    

你们中的任何人都知道我为什么会收到这个错误吗?

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

myTextField.rx.text 是一个ControlProperty&lt;String?&gt;,有时长链会使 Swift 编译器难以区分您要完成的任务。最好声明您的意图并将长链拆分为变量:

func bind() 
    // The way you wanted to do it
    let property: ControlProperty<String> = _textField.rx.text
        .orEmpty
        // Your map here

    property
        .debounce(.milliseconds(500), scheduler: MainScheduler.instance)
        .bind(to: _descriptionLabel.rx.text)
        .disposed(by: _disposeBag)

    // Driver is a bit better for UI
    let text: Driver<String> = _textField.rx.text
        .orEmpty
        // Insert your map here
        .asDriver()

    text
        .debounce(.milliseconds(500))
        .drive(_descriptionLabel.rx.text)
        .disposed(by: _disposeBag)

附:使用Driver 可以为您节省一些 UI 输入并使其更清晰。

【讨论】:

以上是关于RxSwift:将 RX 绑定添加到 UITextField 时出错:“Binder<String?>”类型的值没有成员“debounce”的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift 如何将“清除所有”UIButton 添加到简单的电子表格示例

RxSwift 不将数据绑定到自定义集合视图单元格

RxSwift rx_text 双向绑定崩溃

如何在 RxSwift 中将 UISwitch 绑定到 UIButton 启用?

RxSwift:使用 rx_refreshing 进行 uirefreshcontrol

在 RxSwift 中测试 UITableView.rx.itemSelected 回调