日韩性视频-久久久蜜桃-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扩展的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 久久久久这里只有精品 | 青青草逼 | 欧美一区二区区 | 黄色动漫在线观看 | 国产91在线观看丝袜 | 日本九九视频 | 亚洲国产剧情 | 成人av综合网 | 久草国产在线观看 | 国产做受91 | 国产传媒av| 精品熟妇视频一区二区三区 | 中文不卡av | 超碰在线观看97 | 日韩精品一区二区在线看 | 免费色站 | 国产精品久久久久久久久免费桃花 | 国产极品免费 | 中文日韩 | 色播网址 | av大片在线观看 | 偷操| 精品久久久久中文慕人妻 | 视频久久精品 | 97色爱| 内射后入在线观看一区 | 黄色小网站在线观看 | 成人精品久久久午夜福利 | 中文字幕永久在线观看 | 中文字幕在线一区二区三区 | 日本中文字幕在线播放 | 男操女视频免费 | 波多野吉衣在线视频 | 欧美在线天堂 | 99热激情 | 日皮视频免费看 | 久操视频在线观看免费 | 动漫一区二区三区 | 国产456| 亚洲黄色在线视频 | 国产三级视频网站 | 1024福利 | 亚洲天堂网络 | 女人脱了内裤趴开腿让男躁 | 丝袜美腿中文字幕 | 中文字幕激情视频 | 在线观看视频www | 99福利影院 | 国产成人日韩 | 狠狠操女人 | 午夜久久久久久久久久久 | 免费美女av | 人妻丰满熟妇av无码区不卡 | 毛片基地在线观看 | 欧美11p| 僵尸艳谈 | 中文字幕无码精品亚洲35 | 小泽玛利亚一区二区三区在线观看 | 成年在线观看 | 国产免费中文字幕 | 亚洲精品在线观看视频 | 日韩丰满少妇无码内射 | 日本老妇性生活 | 91精品大片| 久久网站av | 欧洲色区 | 丁香花完整视频在线观看 | 黑人玩弄人妻一区二 | 天堂网视频 | 美女三级黄色片 | 天天弄天天操 | 国产黄色电影 | 吻胸摸激情床激烈视频 | 操一操干一干 | 亚洲一区 欧美 | 观看av免费| 日韩中文字| 在线看片网站 | 国产精品一二三区视频 | 94av| 欧美日韩精品一区二区 | 欧美日韩人妻精品一区在线 | a天堂资源在线 | 欧美另类视频 | 精品久久免费视频 | 中文字幕丝袜 | 91成人在线观看国产 | 男女乱淫视频 | 黄色午夜影院 | 亚洲成网 | 久久亚洲AV成人无码国产人妖 | 女儿的朋友5中汉字晋通话 欧美成人免费高清视频 | 成全世界免费高清观看 | 国产真人无遮挡作爱免费视频 | 男人午夜天堂 | 玖草视频在线 | 国产大片b站| 欧洲国产精品 | 住在隔壁的她动漫免费观看全集下载 |