Reactivecocoa: Sehr einfache Zwei-Wege-Bindung von TextField / TextView an viewModel

Erstellt am 28. Juli 2016  ·  3Kommentare  ·  Quelle: ReactiveCocoa/ReactiveCocoa

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] :(

question

Hilfreichster Kommentar

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.

Alle 3 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen