MVC adecuado para principiantes y más

Pequeña introducción


¡Todos 404! La mayoría de los desarrolladores de iOS no entienden cómo trabajar con Apple-MVC. Debido a que hay críticas irrazonables, los proyectos pequeños intentan escribir en arquitecturas que no están destinadas a esto, los ViewControllers se vuelven enormes, ilegibles, etc.

En este artículo, mostraré una manera simple de hacerme la vida más fácil, la vida para mí mismo, que investigó el proyecto después de 3 meses y, por supuesto, para todos los ViewControllers. ¿Para quién es adecuado? Para principiantes o desarrolladores con pequeños proyectos que terminan con una estructura limpia y hermosa.

¿Dónde se ahogan todos?


Para comenzar, veamos el MVC hermoso favorito de todos.

imagen

Ahora veamos qué implementa la mayoría.

imagen

¿Frio? ¡No! Por lo tanto, no haremos esto, sino que implementaremos la primera opción.

Hacer la estructura de la belleza.


Creamos la aplicación habitual de vista única. Puse Swift en el campo de selección de idioma, sin incluir nada más: ni pruebas ni CoreDat.

Mostraré con el ejemplo de crear un escaparate, porque necesitamos afectar todas las partes de MVC, tomaremos los datos del modelo en el controlador para distribuirlos y mostrarlos a la vista.

Bien, hay una tarea, hay un proyecto vacío. Ahora, sumergiéndome en el proyecto, distribuiré todo en carpetas y crearé archivos vacíos para que entiendas dónde deberían estar en el futuro. También adjunto una estructura de guión gráfico, para no perder el tiempo en el futuro. No olvides especificar la id de reutilización en la celda, escribí ProductCell.

imagen

Generosamente? Por supuesto que es hermoso. Continuamos ...

Un poco de magia veloz


Ahora podemos comenzar la implementación. Comencemos con una vista simple. Necesitamos crear todos los IBOutlets y la configuración de nuestra vista.

//    ,   view     UIKit. 
import UIKit

class ShopView: UIView{
    //       storyboard. 
    @IBOutlet weak var tableView: UITableView!
    //      view. 
    func configure(){
        //     ,    ,      ...
        tableView.estimatedRowHeight = 50
        tableView.rowHeight = 100
    }
}

Así es como se verá nuestra vista, en la función configure () acabo de establecer la configuración, pero la vista debe usarse para animaciones, y para cambiar el título del título del botón, etc. ... ¿Entonces decir primitivamente? Pero, ¿por qué usar esta ventaja tan poco? Entonces, por ejemplo, uso animaciones en el controlador'e: view.hideBorders (self) y eso es todo, y view ya hará una hermosa animación.

//    view  . 
func hideBorders(view: UIView){
    UIView.animate(withDuration: 0.3,
                   delay: 0,
                   options: .curveEaseInOut,
                   animations: {
           //         constraint. 
           self.createViewHeighConstraint.constant = view.bounds.height * 0.6
           //   ,   ,    . 
           self.editButton.layer.cornerRadius = 20
           self.postView.layer.shadowOpacity = 0
           self.postView.layer.cornerRadius = 0
           view.layoutIfNeeded()
    }, completion: nil)
}

¡Fuego! Pero volviendo a nuestro proyecto, es hora de implementar el modelo. Y así tendremos bienes, y que sean sus grupos.

//   ,   model       View.
// ,    ,       Foundation.
import Foundation
//      ,  . 
public struct Product {
  public let name: String
}
//    ,      ,   . 
public struct ProductGroup {
  public let products: [Product]
  public let title: String
}
//  swift   ()    extension. 
extension ProductGroup{
    //  ,     ( Product). 
    public static func vegetables() -> ProductGroup{
       //   .
        let products = [
            Product(name: ""),
            Product(name: ""),
            Product(name: "")
        ]
        //      "". 
        return ProductGroup(products: products, title: "")
    }
}

Genial, nuestro modelo está listo, queda por ensamblar el controlador, transgredimos. En primer lugar, necesitaremos crear dos de nuestras entidades principales, modelo y vista. Luego sacaré la configuración del controlador en una extensión privada y transferiré los datos del modelo a nuestra tabla.

//  controller'e      ,      UIKit.
import UIKit

class ShopController: UIViewController {
    //  -     .
    private var shopModel = ProductGroup.vegetables()
    
    //     (       )
    private var shopView: ShopView! {
        guard isViewLoaded else { return nil }
        return (view as! ShopView)
    }
    //      view,         controller'a  view  . 
    override func viewDidLoad() {
        super.viewDidLoad()
        //    view      .
        configure()
    }
}

private extension ShopController{
    //          .
    func configure(){
        shopView.tableView.delegate = self
        shopView.tableView.dataSource = self
    }
}

//      . 
extension ShopController: UITableViewDataSource, UITableViewDelegate{

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //  -   -   
        return shopModel.products.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //   ,   reuse Id ,      .
        let cell = tableView.dequeueReusableCell(withIdentifier: "ProductCell")
        //    label  cell     . 
        cell?.textLabel?.text = shopModel.products[indexPath.row].name
        return cell!
    }
}

Prometió explicar sobre la vista, ¿no lo olvidó?) Nuestro shopView es una propiedad calculada. Aquí verificamos isViewLoaded para no hacer que la vista se cargue involuntariamente al acceder a esta propiedad. Si la vista ya está cargada, la forzamos a convertirse a ShopView.

Eso es todo, nuestro mvc está listo! Queda presionar comando + R y ver tres celdas.

¿Qué tenemos al final?


  • Arquitectura simple y clara
  • Carga uniforme en modelo, vista, controlador
  • Vista de reutilización fácil
  • Fácil extensibilidad de nuestro proyecto.

Conclusión


Realmente espero que este artículo ayude a los principiantes a mantener sus proyectos limpios, no perderse en el código, sino concentrarse en las tareas. Todo bien y menos errores ^^

All Articles