日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RxSwift之UI控件UITextField与UITextView扩展的使用

發布時間:2024/5/21 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RxSwift之UI控件UITextField与UITextView扩展的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、監聽單個 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 中;
    • 同時 label 中還會實時顯示當前的字數;
    • 最下方的“提交”按鈕會根據當前的字數決定是否可用(字數超過 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() // 將普通序列轉換為 Driver.throttle(0.3) // 在主線程中操作,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:開始編輯(開始輸入內容)
    • editingChanged:輸入內容發生改變
    • editingDidEnd:結束編輯
    • editingDidEndOnExit:按下 return 鍵結束編輯
    • allEditingEvents:包含前面的所有編輯相關事件
  • 監聽輸入框開始編輯事件(獲取到焦點)并做相應的響應:
textField.rx.controlEvent([.editingDidBegin]) //狀態可以組合.asObservable().subscribe(onNext: { _ inprint("開始編輯內容!")}).disposed(by: disposeBag)
  • 在界面上添加兩個輸入框分別用于輸入用戶名和密碼:
    • 如果當前焦點在用戶名輸入框時,按下 return 鍵時焦點自動轉移到密碼輸入框上;
    • 如果當前焦點在密碼輸入框時,按下 return 鍵時自動移除焦點。
// 在用戶名輸入框中按下 return 鍵 username.rx.controlEvent(.editingDidEndOnExit).subscribe(onNext: {[weak self] (_) inself?.password.becomeFirstResponder() }).disposed(by: disposeBag)// 在密碼輸入框中按下 return 鍵 password.rx.controlEvent(.editingDidEndOnExit).subscribe(onNext: {[weak self] (_) inself?.password.resignFirstResponder() }).disposed(by: disposeBag)

五、UITextView 特有的方法

  • UITextView 還封裝了如下幾個委托回調方法:
    • didBeginEditing:開始編輯
    • didEndEditing:結束編輯
    • didChange:編輯內容發生改變
    • 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扩展的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。