У меня есть 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 Вам может понадобиться import enum Result.NoError
для типа NoError
.
В ReactiveCocoa 5.0 такие примитивы, как reactive.text
и reactive.textValues
, предоставляются в различных элементах управления и представлениях UIKit / AppKit.
textField.text <~ viewModel.title.producer
viewModel.title <~ textField.textValues
Хотя у нас пока нет системы двунаправленной привязки в ReactiveCocoa, приведенный выше фрагмент будет работать без бесконечного цикла обратной связи.
Однако это работает только для привязок с элементами управления. Двунаправленные привязки между свойствами, если они вам когда-либо понадобятся, невозможны без посредника между ними.
@andersio Я видел, что вы начали работу над поддержкой двунаправленных привязок для MutableProperty
в ReactiveCocoa / ReactiveSwift # 181 и ReactiveCocoa / ReactiveSwift # 182 пару лет назад. Есть ли какие-либо планы продолжить в какой-то момент, или такая привязка выходит за рамки для ReactiveCocoa / ReactiveSwift? Мне просто любопытно услышать обновления по этому поводу, поскольку я сталкиваюсь с этой проблемой довольно часто, и это всегда приводит меня к этой проблеме GitHub. 😉
Самый полезный комментарий
В ReactiveCocoa 5.0 такие примитивы, как
reactive.text
иreactive.textValues
, предоставляются в различных элементах управления и представлениях UIKit / AppKit.Хотя у нас пока нет системы двунаправленной привязки в ReactiveCocoa, приведенный выше фрагмент будет работать без бесконечного цикла обратной связи.
Однако это работает только для привязок с элементами управления. Двунаправленные привязки между свойствами, если они вам когда-либо понадобятся, невозможны без посредника между ними.