MVC كافية للمبتدئين وأكثر

مقدمة صغيرة


الكل 404! لا يفهم معظم مطوري iOS كيفية العمل مع Apple-MVC. بسبب وجود انتقاد غير معقول ، تحاول المشاريع الصغيرة الكتابة على بنيات غير مخصصة لهذا ، تصبح ViewControllers ضخمة وغير قابلة للقراءة ، وما إلى ذلك.

في هذه المقالة سوف أعرض طريقة بسيطة لجعل الحياة أسهل بالنسبة لي ، الحياة لنفسي ، التي نظرت في المشروع بعد 3 أشهر ، وبالطبع لجميع ViewControllers. لمن هو مناسب؟ للمبتدئين أو المطورين الذين لديهم مشاريع صغيرة تنتهي ببنية نظيفة وجميلة.

أين يغرق الجميع؟


للبدء ، دعنا ننظر إلى MVC القياسي المفضل لدى الجميع.

صورة

الآن دعونا نلقي نظرة على ما يتم تنفيذه من قبل الأغلبية.

صورة

رائع؟ لا! لذلك ، لن نقوم بذلك ، ولكننا سننفذ الخيار الأول.

صنع هيكل الجمال


نقوم بإنشاء تطبيق Single View المعتاد. أضع Swift في مجال اختيار اللغة ، لا يشمل أي شيء آخر: لا الاختبارات ولا CoreDat.

سأريكم مثال إنشاء نافذة متجر ، لأن نحن بحاجة للتأثير على جميع أجزاء MVC ، سنأخذ البيانات من النموذج في وحدة التحكم لتوزيعها وعرضها في العرض.

حسنًا ، هناك مهمة ، هناك مشروع فارغ. الغوص الآن في المشروع ، سوف أقوم بتوزيع كل شيء في مجلدات وإنشاء ملفات فارغة حتى تفهم أين يجب أن تقع في المستقبل. أيضا إرفاق هيكل القصة المصورة ، حتى لا تضيع الوقت في المستقبل. لا تنس تحديد معرف إعادة الاستخدام في الخلية ، كتبت ProductCell.

صورة

بشكل رائع؟ بالطبع إنه جميل. نواصل ...

بعض السحر السريع


الآن يمكننا البدء في التنفيذ. لنبدأ بعرض بسيط. نحن بحاجة إلى إنشاء جميع IBOutlets ، وإعدادات وجهة نظرنا.

//    ,   view     UIKit. 
import UIKit

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

هذه هي الطريقة التي سيبدو بها العرض الخاص بنا ، في وظيفة التهيئة () ، قمت فقط بتعيين الإعدادات ، ولكن يجب استخدام العرض للصور المتحركة ، ولتغيير عنوان عنوان الزر ، وما إلى ذلك ... لذا قل بشكل بدائي؟ ولكن لماذا لا تستخدم هذه الميزة إلا قليلاً ؟! لذا ، على سبيل المثال ، أستخدم الرسوم المتحركة في وحدة التحكم'أ: view.hideBorders (self) وهذا كل شيء ، وستكون طريقة العرض بالفعل رسمًا متحركًا جميلًا.

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

نار! ولكن بالعودة إلى مشروعنا ، حان الوقت لتنفيذ النموذج. وهكذا سيكون لدينا بضائع ، وربما تكون مجموعاتهم.

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

رائع ، نموذجنا جاهز ، يبقى تجميع وحدة التحكم ، لننتهك. بادئ ذي بدء ، سنحتاج إلى إنشاء اثنين من الكيانات الرئيسية لدينا ، والنموذج والرؤية. ثم سأقوم بإخراج إعدادات وحدة التحكم في الملحق الخاص ونقل البيانات من النموذج إلى جدولنا.

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

وعد بشرح وجهة النظر ، لم ينسى؟) our viewView هو خاصية محسوبة. هنا نتحقق من isViewLoaded حتى لا نتسبب في تحميل العرض دون قصد عند الوصول إلى هذه الخاصية. إذا تم تحميل العرض بالفعل ، فإننا نفرض تحويله إلى ShopView.

هذا كل شيء ، mvc لدينا جاهز! يبقى الضغط على الأمر + R ورؤية ثلاث خلايا.

ماذا لدينا في النهاية؟


  • بنية بسيطة وواضحة
  • تحميل موحد على النموذج ، العرض ، وحدة التحكم
  • عرض سهل الاستخدام
  • توسيع مشروعنا بسهولة

استنتاج


آمل حقًا أن تساعد هذه المقالة المبتدئين في الحفاظ على نظافة مشروعاتهم ، وليس الضياع في التعليمات البرمجية ، ولكن التركيز على المهام. جميع البق جيدة وأقل ^ ^

All Articles