我在尽可能基本的iOS应用程序(Swift)中实现ReactiveCocoa 4,以便更好地了解如何将其与MVVM架构一起使用。我的问题是:如何从视图到模型获取UITextField的textSignal?
我在这里的作品有效,但感觉这只有50%被动(在任何情况下都不太漂亮):
VIEW(在viewDidLoad中)
originalTextField.rac_textSignal().subscribeNext{
(next:AnyObject!) -> () in
let text = next as! String
self.viewModel?.originalText=text
}
查看模型
var originalText:String?{
didSet{self.model.originalText=originalText}
}
MODEL
var originalText:String?{
didSet{//Do model stuff}
}
答案 0 :(得分:0)
这就是我目前实现这种行为的方式,我对RAC也是一个新手,所以要把它当作一粒盐。
我正在使用ReactiveCocoa 4.1.0 & Rex 0.10.0
<强>视图模型强>:
MutableProperty
originalText
醇>
可变属性具有producer
属性,您将从视图中绑定该属性。
使用该绑定,调用originalText.producer.startWithNext
将创建一个Signal并添加1个观察者,这样您就可以从ViewModel中接收值
let originalText: MutableProperty<String> = MutableProperty("")
func observeTextField(){
originalText.producer.startWithNext { (str) in
self.model.originalText = str
}
}
查看强>:
添加Rex作为依赖项并导入它。您将使用Rex中的ignoreError
来处理类型冲突。
SignalProducer
定义为SignalProducer<T, ErrorType>
,因此您必须放弃ErrorType
以匹配您的MutableProperty<String>
。
MutableProperty
ViewModel.observeTextField
中缀<~
运算符将生成器绑定到ViewModel的MutableProperty
import Rex
...
let textFieldProducer = (originalTextField.rac_textSignal()
.toSignalProducer()
.map {text in text as! String}
.ignoreError())!
viewModelInstance.originalText <~ textFieldProducer
我希望这会对你有所帮助。