Este repositorio fue creado para fines de demostración en lugar de consumo. Sin embargo, dados los comentarios y el uso de este repositorio, comenzaré a mantenerlo aquí y priortizaré la solución/implementación de problemas aumentados.
MVVM ? ¿Por qué no MVC que Apple recomienda? Android ¿ MVP es genial? ¿Qué tal el patrón Viper Cool? Creo que ya se han realizado grandes esfuerzos para explicar lo que cada patrón aporta a la mesa, por lo que la idea aquí no es agregar al debate, sino simplemente construir sobre la opinión que ya he formado: MVVM es el camino a seguir.
Como un imprimador rápido de lo que es MVVM, es un patrón de diseño mediante el cual el modelo ViewModel media entre un modelo y vista de datos que muestran los datos proporcionados como se muestra a continuación:

En iOS, View es esencialmente un ViewController y ViewModel es un objeto (una estructura) que proporciona datos exactos para que la vista sea renderizada.
Esto proporciona una arquitectura poco acoplada que es mantenible (controladores de vista muy delgados) y comprobable (ViewModel abstrae la interfaz de usuario y, por lo tanto, es fácilmente comprobable)
Sin embargo, todavía hay una advertencia: el MVVM clásico permite un principio de responsabilidad única fácilmente (y maravillosamente) en el caso de los modelos como modelos de dominio. Sin embargo, en el caso de los modelos anémicos (que generalmente es el caso cuando tiene API REST bien escritas), uno también necesitaría otro mediador o presentador que facilite los datos y el flujo de navegación.
Ahora, Ver Model tiene la responsabilidad de actualizar la vista y obtener actualizaciones de la vista sobre los cambios realizados por el usuario. Esto se puede lograr mediante un código mínimo utilizando la unión de datos bidireccionales. Pero ... ¡ iOS no tiene un mecanismo de encuadernación de dos vías disponibles de casa!
Afortunadamente, tenemos bibliotecas reactivas como RXSWIFT, RXCOCOA, pero son demasiado pesados teniendo en cuenta que la unión de dos vías es una parte muy pequeña del paradigma de programación reactiva. SimpleTWowayBinding se esfuerza por proporcionar solo la encuadernación de dos vías, de una manera simple sin pretensiones.
Para ejecutar el proyecto de ejemplo, clonar el repositorio y ejecutar pod install desde el directorio de ejemplo.
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 ( )
}Las propiedades que desea ser "adhesables" a la vista debe declararse como observable.
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 ( )
}
}
} El método bind en el UICONTROL orquesta la unión de dos vías con el observable. Ese es todo el código que se necesita para que el formulario funcione. Vea la captura de pantalla a continuación.
SimpleTWowayBinding está disponible a través de Cocoapods. Para instalarlo, simplemente agregue la siguiente línea a su Podfile:
pod 'SimpleTwoWayBinding' Manish Katoch, [email protected]
SimpleTWowayBinding está disponible bajo la licencia MIT. Consulte el archivo de licencia para obtener más información.