Ich bin ein schnelles und reaktives Kakao-Noob zur gleichen Zeit. Mit MVVM und Reactive Cocoa v3.0-beta.4 Framework möchte ich dieses Setup implementieren, um die Grundlagen des neuen RAC 3-Frameworks zu erlernen.
Ich habe ein Textfeld und möchte, dass die Texteingabe zur Validierung mehr als drei Buchstaben enthält. Wenn der Text die Validierung besteht, sollte die Schaltfläche darunter aktiviert sein. Wenn die Schaltfläche das Touchdown-Ereignis empfängt, möchte ich eine Aktion mithilfe der Eigenschaft des Ansichtsmodells auslösen.
Da es momentan nur sehr wenige Ressourcen zu RAC 3.0 beta gibt, habe ich Folgendes implementiert, indem ich die QAs im Github Repo des Frameworks gelesen habe. Hier ist, was ich bisher kommen konnte:
ViewModel.swift
%Vor%ViewController.swift
%Vor%RACUtilities.swift
%Vor%Bei dieser Konfiguration wird die Schaltfläche aktiviert, wenn der Text des Ansichtsmodells länger als drei Zeichen ist. Wenn der Benutzer auf die Schaltfläche klickt, wird die Aktion des Ansichtsmodells ausgeführt, und ich kann den Rückgabewert als wahr erhalten. So weit so gut.
Meine Frage lautet: Innerhalb der Aktion des Ansichtsmodells möchte ich die gespeicherte Texteigenschaft verwenden und den Code aktualisieren, um eine Netzwerkanforderung zu erstellen. Also brauche ich keine Eingabe von der Seite des View-Controllers. Wie kann ich nicht eine Eingabe für meine Action-Eigenschaft verlangen?
Aus der ReactiveCocoa / CHANGELOG.md :
Eine Aktion muss angeben, welche Art von Eingabe akzeptiert wird, welche Art von Ausgabe erzeugt wird und welche Arten von Fehlern auftreten können (falls vorhanden).
Daher gibt es derzeit keine Möglichkeit, ein Action
ohne Eingabe zu definieren.
Ich nehme an, Sie könnten erklären, dass Sie sich nicht um die Eingabe kümmern, indem Sie AnyObject?
erstellen und CocoaAction
mit comfort initialiser erstellen:
Ich möchte nicht AnyObject?
anstelle von Bool
für validatedTextProducer
verwenden. Ich nehme an, Sie haben es bevorzugt, weil die Bindung an die Eigenschaft buttonEnabled
AnyObject?
erfordert. Ich würde es jedoch lieber dort einsetzen, anstatt die Typklarheit meines Ansichtsmodells zu opfern (siehe Beispiel unten).
Sie möchten möglicherweise die Ausführung von Action
sowohl auf der Ansichtsmodellebene als auch auf der Benutzeroberfläche einschränken, z. B .:
Und Bindung an buttonEnabled
:
Wenn Sie sich Colin Eberhardts Blogpost ansehen ReactiveCocoa 3 gibt es einen sehr netten Ansatz für dieses Problem.
Grundsätzlich, weil es noch in der Beta-Phase ist, gibt es keine Erweiterung für UIView
, die diese Eigenschaften mit RAC3 leicht zu benutzen macht, aber Sie können sie leicht hinzufügen. Ich würde empfehlen, eine Erweiterung UIKit+RAC3.swift
hinzuzufügen und hinzuzufügen, wie Sie brauchen:
Auf diese Weise ersetzen Sie einfach die RAC = RACObserve
Logik durch (zum Beispiel):
Auch dies ist alles aus seinem Blogbeitrag, der viel beschreibender ist als diese Antwort. Ich empfehle jedem, der daran interessiert ist RAC 3 zu benutzen, seine tollen Posts und Tutorials zu lesen:
Tags und Links mvvm ios swift reactive-cocoa reactive-cocoa-3