五、ControlProperty
1,基本介紹
(1)ControlProperty
是專門用來描述 UI
控件屬性,擁有該類型的屬性都是被觀察者(Observable
)。
(2)ControlProperty
具有以下特征:
- 不會產生
error
事件 - 一定在
MainScheduler
訂閱(主線程訂閱) - 一定在
MainScheduler
監聽(主線程監聽) - 共享狀態變化
2,使用樣例
(1)其實在 RxCocoa
下許多 UI
控件屬性都是被觀察者(可觀察序列)。比如我們查看源碼(UITextField+Rx.swift
),可以發現 UITextField
的 rx.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)ControlEvent
和 ControlProperty
一樣,都具有以下特征:
- 不會產生
error
事件 - 一定在
MainScheduler
訂閱(主線程訂閱) - 一定在
MainScheduler
監聽(主線程監聽) - 共享狀態變化
2,使用樣例
(1)同樣地,在 RxCocoa
下許多 UI
控件的事件方法都是被觀察者(可觀察序列)。比如我們查看源碼(UIButton+Rx.swift
),可以發現 UIButton
的 rx.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)運行結果如下: