一、監聽單個 textField 內容的變化(textView 同理)
- 將 textField 里輸入的內容實時地顯示到控制臺中,示例代碼:
let textField
= UITextField(frame
: CGRect(x
:10, y
:80, width
:200, height
:30))
textField
.borderStyle
= UITextField.BorderStyle.roundedRect
self.view
.addSubview(textField
)
textField
.rx
.text
.orEmpty
.asObservable().subscribe(onNext
: {print("您輸入的是:\($0)")}).disposed(by
: disposeBag
)
- .orEmpty 可以將 String? 類型的 ControlProperty 轉成 String,避免再去解包。
- 效果如下:
您輸入的是:
1
您輸入的是:
12
您輸入的是:
123
您輸入的是:
1234
您輸入的是:
12345
您輸入的是:
123456
您輸入的是:
1234567
您輸入的是:
12345678
您輸入的是:
123456789
您輸入的是:
1234567890
二、將內容綁定到其它控件上
- 需要的效果:
-
- 將第一個 textField 里輸入的內容實時地顯示到第二個 textField 中;
-
-
- 最下方的“提交”按鈕會根據當前的字數決定是否可用(字數超過 5 個字才可用)。
- 示例代碼:
let disposeBag
= DisposeBag()
let inputField
= UITextField(frame
: CGRect(x
:50, y
:80, width
:200, height
:30))
inputField
.borderStyle
= UITextField.BorderStyle.roundedRect
self.view
.addSubview(inputField
)
let outputField
= UITextField(frame
: CGRect(x
:50, y
:150, width
:200, height
:30))
outputField
.borderStyle
= UITextField.BorderStyle.roundedRect
self.view
.addSubview(outputField
)
let label
= UILabel(frame
:CGRect(x
:60, y
:190, width
:300, height
:30))
self.view
.addSubview(label
)
let button
:UIButton = UIButton(type
:.system
)
button
.frame
= CGRect(x
:60, y
:230, width
:40, height
:30)
button
.setTitle("提交", for:.normal
)
self.view
.addSubview(button
)
let input
= inputField
.rx
.text
.orEmpty
.asDriver() .throttle(0.3)
input
.drive(outputField
.rx
.text
).disposed(by
: disposeBag
)
input
.map{ "當前字數:\($0.count)" }.drive(label
.rx
.text
).disposed(by
: disposeBag
)
input
.map{ $
0.count > 5 }.drive(button
.rx
.isEnabled
).disposed(by
: disposeBag
)
- Throttling 是 RxSwift 的一個特性,因為當一些東西改變時,通常會做大量的邏輯操作。而使用 Throttling 特性,不會產生大量的邏輯操作,而是以一個小的合理的幅度去執行。比如做一些實時搜索功能時,這個特性很有用。
三、同時監聽多個 textField 內容變化(textView 同理)
- 需要的效果:
-
-
- 無論那一個輸入框內容發生變化,都會將它們拼成完整的號碼并顯示在 label 中。
- 示例代碼:
let disposeBag
= DisposeBag()
let inputField
= UITextField(frame
: CGRect(x
:50, y
:80, width
:200, height
:30))
inputField
.borderStyle
= UITextField.BorderStyle.roundedRect
self.view
.addSubview(inputField
)
let outputField
= UITextField(frame
: CGRect(x
:50, y
:150, width
:200, height
:30))
outputField
.borderStyle
= UITextField.BorderStyle.roundedRect
self.view
.addSubview(outputField
)
let label
= UILabel(frame
:CGRect(x
:60, y
:190, width
:300, height
:30))
self.view
.addSubview(label
)Observable.combineLatest(inputField
.rx
.text
.orEmpty
, outputField
.rx
.text
.orEmpty
) {textValue1
, textValue2
-> String inreturn "你輸入的號碼是:\(textValue1)-\(textValue2)"}.map { $
0 }.bind(to
: label
.rx
.text
).disposed(by
: disposeBag
)
四、事件監聽
- 通過 rx.controlEvent 可以監聽輸入框的各種事件,且多個事件狀態可以自由組合。除了各種 UI 控件都有的 touch 事件外,輸入框還有如下獨有的事件:
-
- editingDidBegin:開始編輯(開始輸入內容)
-
-
-
- editingDidEndOnExit:按下 return 鍵結束編輯
-
- allEditingEvents:包含前面的所有編輯相關事件
- 監聽輸入框開始編輯事件(獲取到焦點)并做相應的響應:
textField
.rx
.controlEvent([.editingDidBegin
]) .asObservable().subscribe(onNext
: { _ inprint("開始編輯內容!")}).disposed(by
: disposeBag
)
- 在界面上添加兩個輸入框分別用于輸入用戶名和密碼:
-
- 如果當前焦點在用戶名輸入框時,按下 return 鍵時焦點自動轉移到密碼輸入框上;
-
- 如果當前焦點在密碼輸入框時,按下 return 鍵時自動移除焦點。
username
.rx
.controlEvent(.editingDidEndOnExit
).subscribe(onNext
: {[weak self] (_) inself?.password
.becomeFirstResponder()
}).disposed(by
: disposeBag
)
password
.rx
.controlEvent(.editingDidEndOnExit
).subscribe(onNext
: {[weak self] (_) inself?.password
.resignFirstResponder()
}).disposed(by
: disposeBag
)
五、UITextView 特有的方法
- UITextView 還封裝了如下幾個委托回調方法:
-
-
-
-
- didChangeSelection:選中部分發生變化
- 使用示例:
textView
.rx
.didBeginEditing
.subscribe(onNext
: {print("開始編輯")}).disposed(by
: disposeBag
)
textView
.rx
.didEndEditing
.subscribe(onNext
: {print("結束編輯")}).disposed(by
: disposeBag
)
textView
.rx
.didChange
.subscribe(onNext
: {print("內容發生改變")}).disposed(by
: disposeBag
)
textView
.rx
.didChangeSelection
.subscribe(onNext
: {print("選中部分發生變化")}).disposed(by
: disposeBag
)
總結
以上是生活随笔為你收集整理的RxSwift之UI控件UITextField与UITextView扩展的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。