تم إنشاء هذا المستودع لغرض العرض التوضيحي بدلاً من الاستهلاك. ومع ذلك ، بالنظر إلى ردود الفعل واستخدام هذا المستودع ، سأبدأ في الحفاظ عليه هنا و priortize التثبيت/تنفيذ القضايا التي أثيرت.
MVVM ؟ لماذا لا توصي Apple؟ Android هل MVP رائع؟ ماذا عن نمط الأفعى الرائع؟ أعتقد أن الجهود الكبيرة قد بذلت بالفعل لشرح ما يجلبه كل نمط إلى الطاولة ، وبالتالي فإن الفكرة هنا هي عدم إضافتها إلى النقاش ولكن مجرد البناء على الرأي الذي قمت بتشكيله بالفعل: MVVM هو الطريق للذهاب.
باعتباره تمهيديًا سريعًا لماهية MVVM ، فهو نمط تصميم يتوسط فيه ViewModel بين البيانات التي توفر النموذج والعرض الذي يعرض البيانات المقدمة كما هو موضح أدناه:

في iOS ، يعد View بشكل أساسي ViewController و ViewModel هو كائن (بنية) يوفر بيانات دقيقة للعرض لتقديمه.
يوفر هذا بنية مقترنة بشكل فضفاض والتي يمكن صيانتها (وحدات تحكم عرض رفيعة للغاية) ويمكن اختبارها (ViewModel تجريد واجهة المستخدم وبالتالي يمكن اختبارها بسهولة)
لا يزال هناك تحذير: يسمح MVVM الكلاسيكي بمبدأ المسؤولية الفردي بسهولة (وجميلة) في حالة النماذج كنماذج للمجال. ومع ذلك ، في حالة النماذج التي تندم الدم (والتي هي الحال عمومًا عندما يكون لديك واجهات برمجة تطبيقات REST المكتوبة جيدًا) ، قد يحتاج المرء أيضًا إلى وسيط أو مقدم آخر يسهل تدفق البيانات وتدفق التنقل.
الآن ، يتحمل نموذج العرض مسؤولية تحديث العرض وكذلك الحصول على تحديثات من العرض فيما يتعلق بالتغييرات التي أجراها المستخدم. يمكن تحقيق ذلك عن طريق الحد الأدنى من التعليمات البرمجية باستخدام ربط البيانات ثنائية الاتجاه. ولكن ... iOS ليس لديه آلية ملزمة في اتجاهين متوفرة خارج الصندوق!
لحسن الحظ ، لدينا مكتبات تفاعلية مثل RXSwift و RXCOCOA ، لكنها ثقيلة للغاية نظرًا لأن الربط ثنائي الاتجاه هو جزء صغير جدًا من نموذج البرمجة التفاعلية. يسعى SimpletWowayBinding لتوفير ملزمة ثنائية فقط ، بطريقة بسيطة متواضعة!
لتشغيل Project Example ، استنساخ REPO ، وتثبيت pod install من الدليل المثال أولاً.
import SimpleTwoWayBinding
struct FormViewModel {
let name : Observable < String > = Observable ( )
let companyName : Observable < String > = Observable ( )
let yearsOfExperience : Observable < Double > = Observable ( )
let isCurrentEmployer : Observable < Bool > = Observable ( false )
let approxSalary : Observable < Float > = Observable ( )
let comments : Observable < String > = Observable ( )
}يجب أن يتم الإعلان عن الخصائص التي تريد أن تكون "قابلة للملل" على أنها قابلة للملاحظة.
class ViewController : UIViewController {
@ IBOutlet weak var nameField : UITextField !
@ IBOutlet weak var companyField : UITextField !
@ IBOutlet weak var isCurrentEmployerSwitch : UISwitch !
@ IBOutlet weak var yearsOfExperienceStepper : UIStepper !
@ IBOutlet weak var salaryRangeSlider : UISlider !
@ IBOutlet weak var selectedSalaryRangeLabel : UILabel !
@ IBOutlet weak var selectedYearsOfExperienceLabel : UILabel !
var viewModel : FormViewModel !
override func viewWillAppear ( _ animated : Bool ) {
super . viewWillAppear ( animated )
self . navigationItem . title = " Survey Form "
setupBindings ( )
}
func setupBindings ( ) {
nameField . bind ( with : viewModel . name )
companyField . bind ( with : viewModel . companyName )
isCurrentEmployerSwitch . bind ( with : viewModel . isCurrentEmployer )
yearsOfExperienceStepper . bind ( with : viewModel . yearsOfExperience )
salaryRangeSlider . bind ( with : viewModel . approxSalary )
selectedSalaryRangeLabel . observe ( for : viewModel . approxSalary ) {
[ unowned self ] ( _ ) in
self . selectedSalaryRangeLabel . text =
self . viewModel . getSalaryString ( )
}
selectedYearsOfExperienceLabel . observe ( for : viewModel . yearsOfExperience ) {
[ unowned self ] ( _ ) in
self . selectedYearsOfExperienceLabel . text =
self . viewModel . getExperienceString ( )
}
}
} طريقة bind على uicontrol تنسيق الطريقتين المرتبطين مع الملاحظة. هذا هو كل رمز مطلوب للحصول على النموذج يعمل. انظر أدناه لقطة الشاشة.
SimpleTwowAwinding متاح من خلال Cocoapods. لتثبيته ، ما عليك سوى إضافة السطر التالي إلى podfile الخاص بك:
pod 'SimpleTwoWayBinding' مانيش كاتوتش ، [email protected]
SimpletWowAwinding متاح بموجب ترخيص معهد ماساتشوستس للتكنولوجيا. انظر ملف الترخيص لمزيد من المعلومات.