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]
:(
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. 😉
Commentaire le plus utile
Dans ReactiveCocoa 5.0, des primitives telles que
reactive.text
etreactive.textValues
sont fournies dans divers contrôles et vues UIKit / AppKit.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.