Swift - RxSwift的使用詳解19(特征序列3:ControlProperty、 ControlEvent)

五、ControlProperty

1,基本介紹

(1)ControlProperty 是專門用來描述 UI 控件屬性,擁有該類型的屬性都是被觀察者(Observable)。

(2)ControlProperty 具有以下特征:

  • 不會產生 error 事件
  • 一定在 MainScheduler 訂閱(主線程訂閱)
  • 一定在 MainScheduler 監聽(主線程監聽)
  • 共享狀態變化

2,使用樣例

(1)其實在 RxCocoa 下許多 UI 控件屬性都是被觀察者(可觀察序列)。比如我們查看源碼(UITextField+Rx.swift),可以發現 UITextFieldrx.text 屬性類型便是 ControlProperty<String?>

import RxSwift
import UIKit
 
extension Reactive where Base: UITextField {
 
    public var text: ControlProperty<String?> {
        return value
    }
 
    public var value: ControlProperty<String?> {
        return base.rx.controlPropertyWithDefaultEvents(
            getter: { textField in
                textField.text
        },
            setter: { textField, value in
                if textField.text != value {
                    textField.text = value
                }
        }
        )
    }
     
    //......
}

(2)那么我們如果想讓一個 textField 里輸入內容實時地顯示在另一個 label 上,即前者作為被觀察者,后者作為觀察者。可以這么寫:

import UIKit
import RxSwift
import RxCocoa
 
class ViewController: UIViewController {
     
    @IBOutlet weak var textField: UITextField!
     
    @IBOutlet weak var label: UILabel!
     
    let disposeBag = DisposeBag()
     
    override func viewDidLoad() {
         
        //將textField輸入的文字綁定到label上
        textField.rx.text
            .bind(to: label.rx.text)
            .disposed(by: disposeBag)
    }
}
 
extension UILabel {
    public var fontSize: Binder<CGFloat> {
        return Binder(self) { label, fontSize in
            label.font = UIFont.systemFont(ofSize: fontSize)
        }
    }
}

(3)運行結果如下:

六 、ControlEvent

1,基本介紹

(1)ControlEvent 是專門用于描述 UI 所產生的事件,擁有該類型的屬性都是被觀察者(Observable)。

(2)ControlEventControlProperty 一樣,都具有以下特征:

  • 不會產生 error 事件
  • 一定在 MainScheduler 訂閱(主線程訂閱)
  • 一定在 MainScheduler 監聽(主線程監聽)
  • 共享狀態變化

2,使用樣例

(1)同樣地,在 RxCocoa 下許多 UI 控件的事件方法都是被觀察者(可觀察序列)。比如我們查看源碼(UIButton+Rx.swift),可以發現 UIButtonrx.tap 方法類型便是 ControlEvent<Void>

import RxSwift
import UIKit
 
extension Reactive where Base: UIButton {
    public var tap: ControlEvent<Void> {
        return controlEvent(.touchUpInside)
    }
}

(2)那么我們如果想實現當一個 button 被點擊時,在控制臺輸出一段文字。即前者作為被觀察者,后者作為觀察者。可以這么寫:

import UIKit
import RxSwift
import RxCocoa
 
class ViewController: UIViewController {
     
    let disposeBag = DisposeBag()
     
    @IBOutlet weak var button: UIButton!
     
    override func viewDidLoad() {
         
        //訂閱按鈕點擊事件
        button.rx.tap
            .subscribe(onNext: {
                print("歡迎訪問hangge.com")
            }).disposed(by: disposeBag)
    }
}

(3)運行結果如下:

RxSwift使用詳解系列
原文出自:www.hangge.com轉載請保留原文鏈接

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本章將向你介紹另一個框架,它是原生RxSwift庫的一部分:RxCocoa。 RxCocoa全平臺通用。每個平臺有...
    大灰很閱讀 886評論 3 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,556評論 25 708
  • 晚上沒做完作業就陪著兒子睡覺了,1點多鐘醒來,整個人超級清醒,前半夜做的夢,全是在做今天的作業。因為是告別拖延的課...
    豆子媽2011閱讀 416評論 0 0
  • 童年像個糖葫蘆 酸酸的,甜甜的 爸爸的嚴厲, 媽媽的嘮叨 是酸酸的; 兒時的天真 玩耍的快樂 是甜甜的。 突然, ...
    零度摩卡閱讀 178評論 0 0
  • 早五點半,老頭穿著他那套功夫衫到花園去打太極,風雨無阻。 功夫衫是四季常備的。春夏有稠衫,秋冬有絲...
    品茗采萱閱讀 2,532評論 8 12