該存儲庫是用於演示目的而不是用於消費的。但是,鑑於此存儲庫的反饋和使用情況,我將開始在此處維護並進行修復/實施凸起的問題。
mvvm ?為什麼不推薦的MVC ? Android MVP很好嗎?涼爽的毒蛇圖案怎麼樣?我相信已經付出了巨大的努力來解釋每種模式給桌子帶來什麼,因此這裡的想法不是要添加到辯論中,而只是在我已經形成的意見之上: MVVM是必經之路。
作為MVVM是什麼的快速入門,它是一種設計模式,該模式在提供模型的數據和視圖之間介導了顯示的數據,該數據顯示瞭如下所示的數據:

在iOS中,視圖本質上是一個viewController ,而ViewModel是一個對象(結構),它為呈現視圖提供了精確的數據。
這提供了一個鬆散的耦合體系結構,可維護(非常薄的視圖控制器)和可測試(ViewModel摘要UI,因此很容易測試)
但是,仍然有一個警告:經典MVVM可以在模型作為域模型的情況下輕鬆(且精美)的單一責任原則。但是,如果發生貧血模型(通常是您寫得很好的REST API時),一個人還需要另一個調解人或演示者,以促進數據和導航流。
現在,視圖模型有責任更新視圖,並從視圖中獲取有關用戶所做更改的更新。這可以通過使用雙向數據綁定來通過最小代碼來實現。但是… iOS沒有兩種綁定機制可用!
幸運的是,我們有反應性的庫,例如rxswift,rxcocoa,但考慮到兩種方式綁定是反應性編程範式的很小一部分。 SimpleTwowayBinding努力以一種簡單的毫無疑問的方式提供兩種綁定!
要運行示例項目,請首先從示例目錄中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 ( )
}
}
} UIControl上的bind方法協調了與可觀察的兩種方式結合。這就是使表單正常工作所需的所有代碼。請參閱下面的屏幕截圖。
SimpleTwowayBinding可通過可可錄提供。要安裝它,只需將以下行添加到您的podfile:
pod 'SimpleTwoWayBinding' Manish Katoch,[email protected]
SimpleTwowayBinding可在MIT許可下獲得。有關更多信息,請參見許可證文件。