Dieses Repository wurde eher zum Demonstrationszweck als zum Konsum erstellt. Angesichts des Feedbacks und der Verwendung dieses Repositorys werde ich es jedoch hier aufrechterhalten und die Behebung/Implementierung von erhöhten Problemen vorstellen.
MVVM ? Warum nicht MVC , den Apple empfiehlt? Android ist MVP großartig, oder? Wie wäre es mit dem coolen Viper -Muster? Ich glaube, es wurden bereits große Anstrengungen unternommen, um zu erklären, was jedes Muster auf den Tisch bringt, und daher ist die Idee hier nicht, die Debatte zu erweitern, sondern lediglich auf die Meinung zu bauen, die ich bereits gebildet habe: MVVM ist der richtige Weg.
Als schnelle Grundierung für das, was MVVM ist, handelt es sich um ein Entwurfsmuster, bei dem das ViewModel zwischen einem Daten und Ansicht vermittelt , das die angegebenen Daten angezeigt, wie sie unten gezeigt sind:

In iOS ist View im Wesentlichen ein ViewController und ViewModel ist ein Objekt (eine Struktur), das genaue Daten für die Ansicht zum Rendern liefert.
Dies liefert eine locker gekoppelte Architektur, die wartbar (sehr dünne Ansichtsregler) und Testsable (ViewModel Abstracts Out the UI) und daher leicht zu prüfbar ist).
Es gibt jedoch immer noch eine Einschränkung: Klassischer MVVM ermöglicht ein einzelnes Verantwortungsprinzip (und wunderschön) bei Modellen als Domänenmodelle. Bei anämischen Modellen (was im Allgemeinen der Fall ist, wenn Sie gut geschriebene Ruhe -APIs haben) würde man auch einen anderen Mediator oder Moderator benötigen, der den Daten und den Navigationsfluss erleichtert.
Das View -Modell hat nun die Verantwortung für die Aktualisierung der Ansicht sowie die Aktualisierung von Ansichten zu den Änderungen des Benutzers. Dies kann durch minimalen Code unter Verwendung bidirektionaler Datenbindung erreicht werden. Aber… iOS hat keinen zwei Wege -Bindungsmechanismus aus der Schachtel!
Zum Glück haben wir reaktive Bibliotheken wie RxSwift, RxCocoa, aber sie sind zu schwer, wenn man bedenkt, dass ein wesentlicher Wege ein sehr kleiner Teil des reaktiven Programmierparadigmas ist. SimpletWowayBinding bemüht sich, auf einfache Weise nur zwei Wege zu binden!
Um das Beispielprojekt auszuführen, klonen Sie das Repo und führen Sie zuerst pod install aus dem Beispielverzeichnis aus.
import SimpleTwoWayBinding
struct FormViewModel {
let name : Observable < String > = Observable ( )
let companyName : Observable < String > = Observable ( )
let yearsOfExperience : Observable < Double > = Observable ( )
let isCurrentEmployer : Observable < Bool > = Observable ( false )
let approxSalary : Observable < Float > = Observable ( )
let comments : Observable < String > = Observable ( )
}Die Eigenschaften, die Sie an die Ansicht "bindbar" möchten, sollten als beobachtbar erklärt werden.
class ViewController : UIViewController {
@ IBOutlet weak var nameField : UITextField !
@ IBOutlet weak var companyField : UITextField !
@ IBOutlet weak var isCurrentEmployerSwitch : UISwitch !
@ IBOutlet weak var yearsOfExperienceStepper : UIStepper !
@ IBOutlet weak var salaryRangeSlider : UISlider !
@ IBOutlet weak var selectedSalaryRangeLabel : UILabel !
@ IBOutlet weak var selectedYearsOfExperienceLabel : UILabel !
var viewModel : FormViewModel !
override func viewWillAppear ( _ animated : Bool ) {
super . viewWillAppear ( animated )
self . navigationItem . title = " Survey Form "
setupBindings ( )
}
func setupBindings ( ) {
nameField . bind ( with : viewModel . name )
companyField . bind ( with : viewModel . companyName )
isCurrentEmployerSwitch . bind ( with : viewModel . isCurrentEmployer )
yearsOfExperienceStepper . bind ( with : viewModel . yearsOfExperience )
salaryRangeSlider . bind ( with : viewModel . approxSalary )
selectedSalaryRangeLabel . observe ( for : viewModel . approxSalary ) {
[ unowned self ] ( _ ) in
self . selectedSalaryRangeLabel . text =
self . viewModel . getSalaryString ( )
}
selectedYearsOfExperienceLabel . observe ( for : viewModel . yearsOfExperience ) {
[ unowned self ] ( _ ) in
self . selectedYearsOfExperienceLabel . text =
self . viewModel . getExperienceString ( )
}
}
} Die bind auf der UIControl orchestriert die Zwei -Wege -Bindung mit dem Beobachtbaren. Das ist alles Code, der benötigt wird, um das Formular zum Laufen zu bringen. Siehe unten Screenshot.
SimpletWowayBinding ist über Cocoapods erhältlich. Um es zu installieren, fügen Sie einfach die folgende Zeile zu Ihrem Podfile hinzu:
pod 'SimpleTwoWayBinding' Manish Katoch, [email protected]
SimpleTWowayBinding ist unter der MIT -Lizenz verfügbar. Weitere Informationen finden Sie in der Lizenzdatei.