Ich habe ein textfield
und ein textView
in meinem UIViewController
und in meinem ViewModel
Ich habe zwei String
Variablen, die ich binden möchte textField
zur Variablen title
und die textView
zur Variablen textBody
. In RAC2 ist es mit RAC einfach, aber was ist mit RAC4 und Swift2?
Ich habe das in StackOverFlow gefunden:
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
aber ich bekomme Use of undeclared type 'NoError'
also habe ich es in NSError
geändert, aber jetzt bekomme ich: Binary operator '<~' cannot be applied to operands of type 'String' and 'SignalProducer<Int?, NSError>' (aka 'SignalProducer<Optional<Int>, NSError>')
self.viewModel.title
ist ein einfaches var title = ""
Ich weiß, dass ich das kann:
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
}
aber warum all diesen Code nur binden und die Verwendung von startWithNext
und [weak self]
:(
Swift hat kein Makro oder KVC in Objekten, daher gibt es keine Bindungsmagie wie RAC()
. Bindungen in Swift zielen auf Property
-Typen ab.
PS Möglicherweise benötigen Sie import enum Result.NoError
für den Typ NoError
.
In ReactiveCocoa 5.0 werden Grundelemente wie reactive.text
und reactive.textValues
in verschiedenen UIKit / AppKit-Steuerelementen und -Ansichten bereitgestellt.
textField.text <~ viewModel.title.producer
viewModel.title <~ textField.textValues
Obwohl wir in ReactiveCocoa noch kein bidirektionales Bindungssystem haben, würde das obige Snippet ohne eine Endlos-Rückkopplungsschleife funktionieren.
Dies funktioniert jedoch nur für Bindungen mit Steuerelementen. Bidirektionale Bindungen zwischen Eigenschaften, falls Sie sie jemals benötigen, sind ohne einen dazwischen liegenden Mediator nicht möglich.
@andersio Ich habe gesehen, dass Sie vor bidirektionalen Bindungen für MutableProperty
in ReactiveCocoa / ReactiveSwift # 181 und ReactiveCocoa / ReactiveSwift # 182 begonnen haben. Gibt es Pläne, irgendwann fortzufahren, oder ist diese Art der Bindung für ReactiveCocoa / ReactiveSwift nicht zulässig? Ich bin nur neugierig, ein Update dazu zu hören, da ich ziemlich oft auf dieses Problem stoße und es mich immer zu diesem GitHub-Problem bringt. 😉
Hilfreichster Kommentar
In ReactiveCocoa 5.0 werden Grundelemente wie
reactive.text
undreactive.textValues
in verschiedenen UIKit / AppKit-Steuerelementen und -Ansichten bereitgestellt.Obwohl wir in ReactiveCocoa noch kein bidirektionales Bindungssystem haben, würde das obige Snippet ohne eine Endlos-Rückkopplungsschleife funktionieren.
Dies funktioniert jedoch nur für Bindungen mit Steuerelementen. Bidirektionale Bindungen zwischen Eigenschaften, falls Sie sie jemals benötigen, sind ohne einen dazwischen liegenden Mediator nicht möglich.