RxSwift текст ControlProperty имеют другое поведение для UITextView и для UITextField - PullRequest
0 голосов
/ 20 февраля 2020

Я хочу изменить вывод, всегда добавляя "+1" в конце каждого изменения. Он отлично работает для UITextField, но для UITextView он излучает бесконечное количество раз.

Может кто-нибудь объяснить, как я могу заставить UITextView вести себя так же, как UITextField в этом примере?

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    @IBOutlet private weak var textField: UITextField!
    @IBOutlet private weak var textView: UITextView!

    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        problem()
        noproblem()
    }

    //This will write infinite number of 111111111 after typing anything
    private func problem() {
        textView.rx.text.map { text in
                    return text! + "1"
        }.asDriver(onErrorJustReturn: "-").drive(textView.rx.text).disposed(by: disposeBag)
    }

    //This will write 1 once per change, as expected!
    private func noproblem() {
        textField.rx.text.map { text in
                    return text! + "1"
        }.asDriver(onErrorJustReturn: "-").drive(textField.rx.text).disposed(by: disposeBag)
    }

}

Когда я отлаживаю, я вижу, что UITextView+Rx.swift имеет условие для этого, но отладчик врет или не работает:

enter image description here enter image description here

1 Ответ

1 голос
/ 22 февраля 2020

textView.rx.text отвечает на все изменения текста, включая изменения, сделанные кодом. Попробуйте это:

textView.rx.didChange
    .asSignal()
    .map { [weak self] _ in
        guard let text = self?.textView.text else {
            return ""
        }
        return text + "1"
    }
    .emit(to: textView.rx.text)
    .disposed(by: disposeBag)
...