我有一个textfield
和textView
在我的UIViewController
,在我的ViewModel
我有两个String
变量,我要绑定的textField
变量title
和textView
变量textBody
。 在RAC2中,使用RAC很简单,但是RAC4和Swift2呢?
我在StackOverFlow中找到了这个:
let producer = textField.rac_textSignal().toSignalProducer()
.flatMapError { error in
return SignalProducer<AnyObject?, NoError>.empty
}
.map { text in Int(text as! String) }
self.viewModel.title <~ producer
但是我得到了Use of undeclared type 'NoError'
所以我将其更改为NSError
但是现在我得到了: Binary operator '<~' cannot be applied to operands of type 'String' and 'SignalProducer<Int?, NSError>' (aka 'SignalProducer<Optional<Int>, NSError>')
self.viewModel.title
是一个简单的var title = ""
我知道我可以做到:
textField.rac_textSignal()
.toSignalProducer()
.map { text in text as! String } // AnyObject -> String
.filter { string in string.characters.count > 0 } // String -> Bool
.startWithNext { [weak self] (text) in
self?.viewModel.title = text
}
但是为什么要绑定所有这些代码并使用startWithNext
和[weak self]
:(
Swift在对象中没有宏或KVC,因此没有像RAC()
这样的绑定魔术。 Swift中的绑定旨在以Property
类型为目标。
PS:对于NoError
类型,您可能需要import enum Result.NoError
。
在ReactiveCocoa 5.0中,在各种UIKit / AppKit控件和视图中提供了诸如reactive.text
和reactive.textValues
。
textField.text <~ viewModel.title.producer
viewModel.title <~ textField.textValues
尽管我们在ReactiveCocoa中还没有双向绑定系统,但是上面的代码片段可以在没有无限反馈环的情况下工作。
但是,这仅适用于与控件的绑定。 如果需要,可以在属性之间进行双向绑定,除非它们之间没有介体。
@andersio我已经看到MutableProperty
上的双向绑定。 是否有计划在某个时候继续进行,还是这种绑定超出了ReactiveCocoa / ReactiveSwift的范围? 我很想听到有关此问题的最新消息,因为我经常遇到这个问题,并且总是把我带到这个GitHub问题上。 😉
最有用的评论
在ReactiveCocoa 5.0中,在各种UIKit / AppKit控件和视图中提供了诸如
reactive.text
和reactive.textValues
。尽管我们在ReactiveCocoa中还没有双向绑定系统,但是上面的代码片段可以在没有无限反馈环的情况下工作。
但是,这仅适用于与控件的绑定。 如果需要,可以在属性之间进行双向绑定,除非它们之间没有介体。