Reactivecocoa: Liaison bidirectionnelle TextField / TextView très basique pour viewModel

Créé le 28 juil. 2016  ·  3Commentaires  ·  Source: ReactiveCocoa/ReactiveCocoa

J'ai un textfield et un textView dans mon UIViewController et dans ma ViewModel j'ai deux variables String , je veux lier le textField à la variable title et le textView à la variable textBody . Dans RAC2, c'est simple avec RAC, mais qu'en est-il du RAC4 et du Swift2?

J'ai trouvé ceci dans 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

mais j'obtiens Use of undeclared type 'NoError' donc je l'ai changé en NSError mais maintenant j'obtiens: Binary operator '<~' cannot be applied to operands of type 'String' and 'SignalProducer<Int?, NSError>' (aka 'SignalProducer<Optional<Int>, NSError>')

self.viewModel.title est un simple var title = ""

Je sais que je peux faire ça:

        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
        }

mais pourquoi tout ce code à lier et l'utilisation de startWithNext et [weak self] :(

question

Commentaire le plus utile

Dans ReactiveCocoa 5.0, des primitives telles que reactive.text et reactive.textValues sont fournies dans divers contrôles et vues UIKit / AppKit.

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

Bien que nous n'ayons pas encore de système de liaison bidirectionnelle dans ReactiveCocoa, l'extrait de code ci-dessus fonctionnerait sans une boucle de rétroaction infinie.

Cela ne fonctionne que pour les liaisons avec des contrôles. Les liaisons bidirectionnelles entre les propriétés, si jamais vous en avez besoin, sont impossibles sans un médiateur entre les deux.

Tous les 3 commentaires

Swift n'a pas de macro ou KVC dans les objets, il n'y a donc pas de magie de liaison comme RAC() . Les liaisons dans Swift sont destinées à cibler les types Property .

PS Vous aurez peut-être besoin de import enum Result.NoError pour le type NoError .

Dans ReactiveCocoa 5.0, des primitives telles que reactive.text et reactive.textValues sont fournies dans divers contrôles et vues UIKit / AppKit.

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

Bien que nous n'ayons pas encore de système de liaison bidirectionnelle dans ReactiveCocoa, l'extrait de code ci-dessus fonctionnerait sans une boucle de rétroaction infinie.

Cela ne fonctionne que pour les liaisons avec des contrôles. Les liaisons bidirectionnelles entre les propriétés, si jamais vous en avez besoin, sont impossibles sans un médiateur entre les deux.

@andersio J'ai vu que vous aviez commencé le travail sur le support des liaisons bidirectionnelles sur MutableProperty dans ReactiveCocoa / ReactiveSwift # 181 et ReactiveCocoa / ReactiveSwift # 182 il y a quelques années. Y a-t-il des plans pour continuer à un moment donné, ou ce type de liaison est-il hors de portée pour ReactiveCocoa / ReactiveSwift? Je suis juste curieux d'entendre une mise à jour à ce sujet car je rencontre ce problème assez souvent, et cela m'amène toujours à ce problème GitHub. 😉

Cette page vous a été utile?
0 / 5 - 0 notes