UITextField.rx.text가 이벤트를 발행하는 타이밍

14154 단어 iOSSwiftRxSwift
UITextField.rx.text가 이벤트를 발행하는 타이밍을 요약했습니다.

이벤트 목록




조작 내용
UITextField.rx.text 이벤트 발생 횟수
동시에 발행되는 UIControl.Event 이벤트


구독
1회
없음

텍스트 필드를 탭하여 초점을 맞춥니다.
1회
editingDidBegin

화면 탭으로 포커스 제거
1회
editingDidEnd

키보드로 한 문자 입력
1회
editingChanged

키보드에서 리턴 키를 탭합니다.
두 번
editingDidEndOnExit 및 editingDidEnd

UITextField.text에 코드에서 문자 할당
0회
없음

UITextField.text에 코드에서 문자를 할당하고 valueChanged 메시지를 보냅니다.
1회
valueChanged


키보드로 리턴 키를 탭했을 때, 입력되고 있는 캐릭터 라인이 2회 스트림에 흘러 오기 때문에, UITextField.rx.text를 구독해 API 리퀘스트를 실시하는 등의 처리를 하고 있는 경우는 불필요한 통신이 발생하지 않도록 주의가 필요합니다.
아래에서 소개하고 있는 코드를 봐 주시면 좋겠습니다만, 이러한 불필요한 이벤트에의 대응으로서 UITextField.isEditing property를 사용할 수 있을지도 모릅니다.

또, UITextField.text에 코드로부터 캐릭터 라인을 대입했을 경우, UITextField.sendActions(for: .valueChanged) 를 실행하지 않으면 UITextField.rx.text 이벤트가 흐르지 않는 점도 주의합시다.

화면과 코드



테스트에 사용한 화면과 코드를 아래에 둡니다.

화면은 하나의 UITextField와 두 개의 UIButton으로 구성됩니다.



ViewController의 구현은 다음과 같습니다.
UITextField.rx.text 속성 및 UITextField와 관련된 이벤트를 구독하고 있습니다.
또한 ViewController의 view 속성에 탭 제스처를 추가합니다.
class ViewController: UIViewController {
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var button2: UIButton!

    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        let gesture = UITapGestureRecognizer()
        view.addGestureRecognizer(gesture)

        gesture.rx.event.asDriver()
            .drive(onNext: { [unowned self] event in
                print("tap event: \(event)")
                self.view.endEditing(true)
            })
            .disposed(by: disposeBag)

        textField.rx.text.orEmpty.asDriver()
            .drive(onNext: { [unowned self] text in
                print("text: \(text)")
                print("isEditing: \(self.textField.isEditing)")
            })
            .disposed(by: disposeBag)

        textField.rx.controlEvent(.editingDidBegin).asDriver()
            .drive(onNext: { _ in
                print("editingDidBegin")
            })
            .disposed(by: disposeBag)

        textField.rx.controlEvent(.editingChanged).asDriver()
            .drive(onNext: { _ in
                print("editingChanged")
            })
            .disposed(by: disposeBag)

        textField.rx.controlEvent(.editingDidEnd).asDriver()
            .drive(onNext: { _ in
                print("editingDidEnd")
            })
            .disposed(by: disposeBag)

        textField.rx.controlEvent(.editingDidEndOnExit).asDriver()
            .drive(onNext: { _ in
                print("editingDidEndOnExit")
            })
            .disposed(by: disposeBag)

        textField.rx.controlEvent(.valueChanged).asDriver()
            .drive(onNext: { _ in
                print("valueChanged")
            })
            .disposed(by: disposeBag)

        button.rx.tap.asDriver()
            .drive(onNext: { [unowned self] _ in
                print("button tapped")
                self.textField.text = "button"
            })
            .disposed(by: disposeBag)

        button2.rx.tap.asDriver()
            .drive(onNext: { [unowned self] _ in
                print("button2 tapped")
                self.textField.text = "button2"
                self.textField.sendActions(for: .valueChanged)
            })
            .disposed(by: disposeBag)
    }
}

실행 로그



화면 조작 내용과 그 때의 출력 로그입니다.

화면 표시 직후


text: 
isEditing: false

텍스트 필드를 탭하여 초점을 맞출 때


text:
isEditing: true
editingDidBegin

화면을 탭하여 텍스트 필드에서 포커스를 제거한 경우


tap event: <UITapGestureRecognizer: 0x6040001f3d00; state = Ended; view = <UIView 0x7f8f4a50a130>; target= <(action=eventHandler:, target=<_TtGC7RxCocoa13GestureTargetCSo22UITapGestureRecognizer_ 0x600000252690>)>>
text:
isEditing: false
editingDidEnd

"a"라는 문자를 입력했을 때


text: a
isEditing: true
editingChanged

문자 "a"가 입력된 상태에서 리턴 키를 탭했을 때


text: a
isEditing: true
editingDidEndOnExit
text: a
isEditing: false
editingDidEnd

"Button"을 탭했을 때


button tapped

"Button2"를 탭했을 때


button2 tapped
text: button2
isEditing: false
valueChanged

좋은 웹페이지 즐겨찾기