RxSwift: ошибка при добавлении привязки RX к UITextField: значение типа "Binder <String?>" Не имеет члена "debounce"

Я пытаюсь добавить задержку в 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<String?>, а иногда длинные цепочки могут вызвать у компилятора 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)
}

PS Используя Driver избавит вас от набора текста для пользовательского интерфейса и сделает его немного понятнее.

Другие вопросы по тегам