昨天講完了如何在UIControl Event新增Publisher,今天就來做個小練習,讓label的文字等於我在textField內輸入的值吧!
首先,在你的ViewModel內import Combine,宣告AnyCancellable用於取消訂閱流程,還有label的text。
import Foundation
import Combine
class MainViewModel{
var uiObservers = Set<AnyCancellable>()
var text :String = ""
func setLabelText(text:String){
self.text = text
}
}
而在View裡面,必須先宣告他的ViewModel
var mainViewModel = MainViewModel()
再來就是利用昨天說到的UIControl Event Publisher去監聽事件
func bindingUIControlEvent(){
//開始編輯TextField時,按下空白鍵會收起鍵盤
myTextField.publisher(for: .editingDidBegin).sink{
[unowned self] _ in
addGestureRecognizer()
}.store(in: &mainViewModel.uiObservers)
//監聽TextField內的文字,將其傳至ViewModel
myTextField.publisher(for: .editingChanged).sink{
[unowned self] _ in
mainViewModel.setLabelText(text: myTextField.text!)
}.store(in: &mainViewModel.uiObservers)
//按下按鈕後,Label的文字變成ViewModel存的值
button.publisher(for: .touchUpInside).sink{
self.label.text = self.mainViewModel.text
}.store(in: &mainViewModel.uiObservers)
}
如此一來小小實作就完成囉!
剛開始接觸Combine時可能會不太懂要如何起手,可以透過這類的小練習去理解其中的概念,熟能生巧,相信你各位也可以的!