MVC yang memadai untuk pemula dan banyak lagi

Pengantar kecil


Semua 404! Sebagian besar pengembang iOS tidak mengerti cara bekerja dengan Apple-MVC. Karena kritik yang tidak masuk akal, proyek-proyek kecil mencoba menulis tentang arsitektur yang tidak dimaksudkan untuk ini, ViewControllers menjadi sangat besar, tidak dapat dibaca, dan sebagainya.

Dalam artikel ini saya akan menunjukkan cara sederhana untuk membuat hidup lebih mudah untuk saya sendiri, hidup untuk diri saya sendiri, yang telah melihat ke dalam proyek setelah 3 bulan, dan, tentu saja, untuk semua ViewControllers. Untuk siapa ini cocok? Untuk pemula atau pengembang dengan proyek kecil yang berakhir dengan struktur yang bersih dan indah.

Di mana semua orang tenggelam?


Untuk memulai, mari kita lihat MVC cantik standar favorit semua orang.

gambar

Sekarang mari kita lihat apa yang sedang dilaksanakan oleh mayoritas.

gambar

Keren? Tidak! Oleh karena itu, kami tidak akan melakukan ini, tetapi akan menerapkan opsi pertama.

Membuat struktur keindahan


Kami membuat Aplikasi Tampilan Tunggal yang biasa. Saya menempatkan Swift di bidang pemilihan bahasa, tidak termasuk yang lain: baik tes, maupun CoreDat.

Saya akan menunjukkan dengan contoh membuat jendela toko, karena kita perlu mempengaruhi semua bagian MVC, kita akan mengambil data dari model ke pengontrol untuk didistribusikan dan ditampilkan.

Oke, ada tugas, ada proyek kosong. Sekarang menyelam ke dalam proyek, saya akan mendistribusikan semuanya ke folder dan membuat file kosong sehingga Anda mengerti di mana mereka akan berada di masa depan. Juga dilampirkan struktur storyboard, agar tidak membuang waktu di masa depan. Jangan lupa untuk menentukan id digunakan kembali di sel, saya menulis ProductCell.

gambar

Dengan tampan? Tentu saja itu indah. Kita lanjutkan ...

Beberapa sihir cepat


Sekarang kita bisa mulai implementasi. Mari kita mulai dengan tampilan sederhana. Kita perlu membuat semua IBOutlet, dan pengaturan untuk tampilan kita.

//    ,   view     UIKit. 
import UIKit

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

Beginilah tampilan kita akan terlihat, dalam fungsi configure (), saya hanya mengatur pengaturan, tetapi tampilan perlu digunakan untuk animasi, dan untuk mengubah judul judul tombol, dll. ... Jadi, katakanlah secara primitif? Tapi mengapa manfaat ini begitu kecil ?! Jadi, misalnya, saya menggunakan animasi di controller'e: view.hideBorders (self) dan hanya itu, dan view sudah akan membuat animasi yang indah.

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

Api! Namun kembali ke proyek kami, saatnya menerapkan model. Jadi kita akan memiliki barang, dan mungkin kelompok mereka.

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

Hebat, model kami sudah siap, masih untuk merakit controller, mari kita melampaui. Pertama-tama, kita perlu membuat dua entitas utama kita, model dan tampilan. Kemudian saya akan mengambil pengaturan pengontrol di ekstensi pribadi dan mentransfer data dari model ke tabel kami.

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

Dia berjanji untuk menjelaskan tentang tampilan, tidak lupa?) ShopView kami adalah properti yang dihitung. Di sini kita periksa isViewLoaded agar tidak menyebabkan tampilan tidak sengaja saat mengakses properti ini. Jika tampilan sudah dimuat, kami memaksanya untuk dikonversi ke ShopView.

Itu dia, MVC kami sudah siap! Tetap menekan perintah + R dan melihat tiga sel.

Apa yang kita miliki pada akhirnya?


  • Arsitektur sederhana dan jelas
  • Beban seragam pada model, tampilan, pengontrol
  • Tampilan penggunaan ulang yang mudah
  • Mudah diperpanjang proyek kami

Kesimpulan


Saya sangat berharap bahwa artikel ini akan membantu pemula untuk menjaga proyek mereka tetap bersih, tidak tersesat dalam kode, tetapi untuk berkonsentrasi pada tugas. Semua bug baik dan lebih sedikit ^^

All Articles