Ce référentiel a été créé à des fins de démonstration plutôt que pour la consommation. Cependant, compte tenu des commentaires et de l'utilisation de ce référentiel, je commencerai à le maintenir ici et à priser la fixation / la mise en œuvre des problèmes soulevés.
MVVM ? Pourquoi pas MVC qu'Apple recommande? Android est-il génial MVP , non? Et le motif de vipère cool? Je crois que de grands efforts ont déjà été déployés pour expliquer ce que chaque modèle apporte à la table et donc l'idée ici n'est pas d'ajouter au débat, mais simplement de construire en plus de l'opinion que j'ai déjà formée: MVVM est la voie à suivre.
En tant qu'amorce rapide à ce qu'est MVVM, c'est un modèle de conception par lequel le ViewModel intervient entre un modèle de fourniture de données et de vue qui affiche les données fournies comme indiqué ci-dessous:

Dans iOS, View est essentiellement un ViewController et ViewModel est un objet (une structure) qui fournit des données exactes pour la vue à rendre.
Cela fournit une architecture à couplage vaguement qui est maintenable (contrôleurs de vue très mince) et testable (ViewModel résume l'interface utilisateur et est donc facilement testable)
Il y a encore une mise en garde cependant: le MVVM classique permet facilement (et magnifiquement) un principe de responsabilité unique en cas de modèles en tant que modèles de domaine. Cependant, en cas de modèles anémiques (ce qui est généralement le cas lorsque vous avez des API de repos bien écrites), il faudrait également un autre médiateur ou présentateur qui facilite le flux de données et de navigation.
Maintenant, le modèle de vue a la responsabilité de mettre à jour la vue et d'obtenir des mises à jour de la vue concernant les modifications apportées par l'utilisateur. Cela peut être réalisé par un code minimum en utilisant la liaison bidirectionnelle des données. Mais… iOS n'a pas de mécanisme de liaison à deux façons disponibles dans la boîte!
Heureusement, nous avons des bibliothèques réactives comme Rxswift, RXCOCOA, mais elles sont trop lourdes étant donné que la liaison bidirectionnelle est une très petite partie du paradigme de programmation réactive. Simpletwowaybinding s'efforce de fournir une liaison bidirectionnelle, d'une manière simple sans prétention!
Pour exécuter l'exemple de projet, clonez le repo et exécutez d'abord pod install à partir de l'exemple du répertoire.
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 ( )
}Les propriétés que vous souhaitez être "liées" à la vue doivent être déclarées observables.
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 ( )
}
}
} La méthode bind sur l'UIControl orchestre la liaison bidirectionnelle avec l'observable. C'est tout le code nécessaire pour faire fonctionner le formulaire. Voir ci-dessous la photo de l'écran.
Simpletwowaybinding est disponible via Cocoapods. Pour l'installer, ajoutez simplement la ligne suivante à votre podfile:
pod 'SimpleTwoWayBinding' Manish Katoch, [email protected]
SimpletWowayBinding est disponible sous la licence MIT. Voir le fichier de licence pour plus d'informations.