MVC adéquat pour les débutants et plus

Petite introduction


Tous les 404! La plupart des développeurs iOS ne comprennent pas comment travailler avec Apple-MVC. En raison de critiques déraisonnables, les petits projets tentent d'écrire sur des architectures qui ne sont pas destinées à cela, les ViewControllers deviennent énormes, illisibles, etc.

Dans cet article , je vais montrer un simple , moyen de rendre la vie plus facile pour moi - même, la vie pour moi - même, qui a examiné le projet au bout de 3 mois, et, bien sûr, pour tous ViewControllers. À qui convient-il? Pour les débutants ou les développeurs avec de petits projets qui se retrouvent avec une structure propre et belle.

Où est-ce que tout le monde se noie?


Pour commencer, regardons le beau MVC standard préféré de tout le monde.

image

Voyons maintenant ce qui est mis en œuvre par la majorité.

image

Cool? Non! Par conséquent, nous ne le ferons pas, mais nous mettrons en œuvre la première option.

Faire la structure de la beauté


Nous créons l'application Single View habituelle. J'ai mis Swift dans le champ de sélection de la langue, sans rien inclure d'autre: ni tests, ni CoreDat.

Je vais montrer par l'exemple de la création d'une vitrine, car nous devons affecter toutes les parties de MVC, nous prendrons les données du modèle dans le contrôleur pour les diffuser et les afficher en vue.

D'accord, il y a une tâche, il y a un projet vide. Maintenant, plongeant dans le projet, je vais tout distribuer dans des dossiers et créer des fichiers vides pour que vous compreniez où ils devraient se trouver à l'avenir. Également joint une structure de storyboard, afin de ne pas perdre de temps à l'avenir. N'oubliez pas de spécifier l'ID de réutilisation dans la cellule, j'ai écrit ProductCell.

image

Magnifiquement? Bien sûr, c'est beau. Nous continuons ...

De la magie rapide


Nous pouvons maintenant commencer la mise en œuvre. Commençons par une vue simple. Nous devons créer tous les IBOutlets et les paramètres de notre vue.

//    ,   view     UIKit. 
import UIKit

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

Voici à quoi ressemblera notre vue, dans la fonction configure (), je viens de définir les paramètres, mais la vue doit être utilisée pour les animations, et pour changer le titre du titre du bouton, etc ... Donc, primitivement dire? Mais pourquoi alors utiliser si peu cet avantage?! Donc, par exemple, j'utilise des animations dans le controller'e: view.hideBorders (self) et c'est tout, et view fera déjà une belle animation.

//    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)
}

Feu! Mais revenons à notre projet, il est temps de mettre en place le modèle. Et donc nous aurons des biens, et que leurs groupes soient.

//   ,   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: "")
    }
}

Génial, notre modèle est prêt, il reste à assembler le contrôleur, transgressons. Tout d'abord, nous devrons créer deux de nos principales entités, le modèle et la vue. Ensuite, je vais retirer les paramètres du contrôleur dans l'extension privée et transférer les données du modèle vers notre table.

//  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!
    }
}

Il a promis d'expliquer la vue, n’a pas oublié?) Notre boutique View est une propriété calculée. Ici, nous vérifions isViewLoaded afin de ne pas provoquer le chargement involontaire de la vue lors de l'accès à cette propriété. Si la vue est déjà chargée, nous la forçons à être convertie en ShopView.

Ça y est, notre mvc est prêt! Il reste à appuyer sur commande + R et à voir trois cellules.

Qu'avons-nous finalement?


  • Architecture simple et claire
  • Charge uniforme sur le modèle, la vue, le contrôleur
  • Vue de réutilisation facile
  • Extensibilité aisée de notre projet

Conclusion


J'espère vraiment que cet article aidera les débutants à garder leurs projets propres, à ne pas se perdre dans le code, mais à se concentrer sur les tâches. Tous les bons et moins de bugs ^^

All Articles