Angemessene MVC für Anfänger und mehr

Kleine Einführung


Alle 404! Die meisten iOS-Entwickler verstehen die Arbeit mit Apple-MVC nicht. Aufgrund der unangemessenen Kritik versuchen kleine Projekte, auf Architekturen zu schreiben, die nicht dafür vorgesehen sind. ViewController werden riesig, unlesbar und so weiter.

In diesem Artikel werde ich einen einfachen Weg zeigen, um mir das Leben zu erleichtern, das Leben für mich selbst, der sich nach 3 Monaten mit dem Projekt befasst hat, und natürlich für alle ViewController. Für wen ist es geeignet? Für Anfänger oder Entwickler mit kleinen Projekten, die eine saubere und schöne Struktur haben.

Wo ertrinken alle?


Schauen wir uns zunächst die beliebtesten Standard-MVCs aller an.

Bild

Schauen wir uns nun an, was von der Mehrheit umgesetzt wird.

Bild

Cool? Nein! Daher werden wir dies nicht tun, sondern die erste Option implementieren.

Die Struktur der Schönheit machen


Wir erstellen die übliche Single View App. Ich habe Swift in das Feld für die Sprachauswahl eingefügt, ohne etwas anderes einzuschließen: weder Tests noch CoreDats.

Ich werde am Beispiel der Erstellung eines Schaufensters zeigen, weil Wir müssen alle Teile von MVC beeinflussen. Wir werden die Daten aus dem Modell in der Steuerung übernehmen, um sie zu verteilen und in der Ansicht anzuzeigen.

Okay, es gibt eine Aufgabe, es gibt ein leeres Projekt. Wenn ich jetzt in das Projekt eintauche, werde ich alles in Ordnern verteilen und leere Dateien erstellen, damit Sie verstehen, wo sie in Zukunft liegen sollten. Außerdem wurde eine Storyboard-Struktur angehängt, um in Zukunft keine Zeit zu verschwenden. Vergessen Sie nicht , die Wiederverwendungs-ID in der Zelle anzugeben. Ich habe ProductCell geschrieben.

Bild

Schön? Natürlich ist es wunderschön. Wir machen weiter ...

Etwas Magie schnell


Jetzt können wir mit der Implementierung beginnen. Beginnen wir mit einer einfachen Ansicht. Wir müssen alle IBOutlets und die Einstellungen für unsere Ansicht erstellen.

//    ,   view     UIKit. 
import UIKit

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

So wird unsere Ansicht aussehen. In der Funktion configure () habe ich nur die Einstellungen festgelegt, aber die Ansicht muss für Animationen und zum Ändern des Titels der Schaltfläche usw. verwendet werden. Also primitiv sagen? Aber warum dann diesen Vorteil so wenig nutzen ?! So verwende ich zum Beispiel Animationen im Controller'e: view.hideBorders (self) und das wars, und view macht bereits eine schöne 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)
}

Feuer! Aber zurück zu unserem Projekt, Zeit, das Modell zu implementieren. Und so werden wir Waren haben, und mögen ihre Gruppen sein.

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

Großartig, unser Modell ist fertig, es bleibt die Montage des Controllers, lasst uns übertreten. Zunächst müssen wir zwei unserer Hauptentitäten erstellen, Modell und Ansicht. Dann werde ich die Controller-Einstellungen in der privaten Erweiterung herausnehmen und die Daten vom Modell in unsere Tabelle übertragen.

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

Er hat versprochen, die Ansicht zu erklären, nicht vergessen?) Unsere shopView ist eine berechnete Eigenschaft. Hier überprüfen wir isViewLoaded, um zu verhindern, dass die Ansicht beim Zugriff auf diese Eigenschaft unbeabsichtigt geladen wird. Wenn die Ansicht bereits geladen ist, erzwingen wir die Konvertierung in ShopView.

Das war's, unser MVC ist fertig! Es bleibt, Befehl + R zu drücken und drei Zellen zu sehen.

Was haben wir am Ende?


  • Einfache, klare Architektur
  • Gleichmäßige Belastung von Modell, Ansicht, Steuerung
  • Einfache Wiederverwendungsansicht
  • Einfache Erweiterbarkeit unseres Projekts

Fazit


Ich hoffe wirklich, dass dieser Artikel Anfängern hilft, ihre Projekte sauber zu halten, sich nicht im Code zu verlieren, sondern sich auf Aufgaben zu konzentrieren. Alles gut und weniger Fehler ^^

All Articles