Reactivecocoa: Очень простая двусторонняя привязка TextField / TextView к viewModel

Созданный на 28 июл. 2016  ·  3Комментарии  ·  Источник: ReactiveCocoa/ReactiveCocoa

У меня есть 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] :(

question

Самый полезный комментарий

В ReactiveCocoa 5.0 такие примитивы, как reactive.text и reactive.textValues , предоставляются в различных элементах управления и представлениях UIKit / AppKit.

textField.text <~ viewModel.title.producer
viewModel.title <~ textField.textValues

Хотя у нас пока нет системы двунаправленной привязки в ReactiveCocoa, приведенный выше фрагмент будет работать без бесконечного цикла обратной связи.

Однако это работает только для привязок с элементами управления. Двунаправленные привязки между свойствами, если они вам когда-либо понадобятся, невозможны без посредника между ними.

Все 3 Комментарий

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. 😉

Была ли эта страница полезной?
0 / 5 - 0 рейтинги