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
Reference
이 문제에 관하여(UITextField.rx.text가 이벤트를 발행하는 타이밍), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takehilo/items/bcabb2a5052c9c93e6fd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)