该存储库是用于演示目的而不是用于消费的。但是,鉴于此存储库的反馈和使用情况,我将开始在此处维护并进行修复/实施凸起的问题。
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许可下获得。有关更多信息,请参见许可证文件。