我正在一个尽可能基本的 iOS 应用程序 (Swift) 中实现 ReactiveCocoa 4,以便更好地了解如何将它与 MVVM 架构一起使用。我的问题是:如何从 View 到模型获取 UITextField 的文本信号?
我在这里得到的是有效的,但感觉这只是 50% 的 react (而且在任何情况下都不太漂亮):
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}
}
模型
var originalText:String?{
didSet{//Do model stuff}
}
最佳答案
这就是我目前实现此行为的方式,我也是 RAC 的新手,所以对它持保留态度。
我正在使用 ReactiveCocoa 4.1.0 & Rex 0.10.0
View 模型:
- 设置
MutableProperty
对于originalText
可变属性有一个 producer
您将从 View 中绑定(bind)到的属性。
有了那个界限,调用originalText.producer.startWithNext
将创建一个 Signal 并添加 1 个观察者,这样您就可以从 ViewModel 中接收值
let originalText: MutableProperty<String> = MutableProperty("")
func observeTextField(){
originalText.producer.startWithNext { (str) in
self.model.originalText = str
}
}
查看:
添加Rex作为依赖并导入它。您将使用 ignoreError
从 Rex 处理类型冲突。
SignalProducer
定义为 SignalProducer<T, ErrorType>
所以你必须删除 ErrorType
匹配您的 MutableProperty<String>
.
- 从文本字段创建信号生成器
- 忽略信号生成器上的错误
- 将信号生成器绑定(bind)到您的 ViewModel 的
MutableProperty
- 调用
ViewModel.observeTextField
从第 3 步绑定(bind)后的 View
中缀 <~
运算符将生产者绑定(bind)到您的 ViewModel 的 MutableProperty
import Rex
...
let textFieldProducer = (originalTextField.rac_textSignal()
.toSignalProducer()
.map {text in text as! String}
.ignoreError())!
viewModelInstance.originalText <~ textFieldProducer
希望对你有帮助
关于ios - 使用 ReactiveCocoa 4 在 MVVM 中将信号从 View 传递到模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33477201/