首先先看看這個 extension
extension UITextField {
var textPublisher: AnyPublisher<String?, Never> {
NotificationCenter.default // 1
.publisher(for: UITextField.textDidChangeNotification, object: self)
.compactMap { $0.object as? UITextField } // 2
.filter { $0 == self } // 3
.map { $0.text}
.eraseToAnyPublisher()
}
}
NotificationCenter
的 Publisher透過這樣的方式, 我們可以創造 UITextField
的事件流!
import Combine
class ViewController: UIViewController {
@IBOutlet var aTextFileld: UITextField!
@IBOutlet var bTestField: UITextField!
var set = Set<AnyCancellable>()
let vc = UIViewController()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
aTextFileld.textPublisher
.assign(to: \UITextField.text, on: bTestField)
.store(in: &set)
}
}
如此, 就可以利用 UIKit 來理解 Combine 了
簡單測驗:
UICotrol
參考來源: Multiple UITextFields and textDidChangeNotification notification
https://stackoverflow.com/a/56796398/10172299
好奇問一下 Combine現在還沒有類似Rxcocoa的東西嗎
我對 RxCocoa 不熟,要類似什麼呢?
就是做你上面做的事 一整包對UI的extension
目前 Apple 主要在 SwiftUI 有建立,未來不確定喔