MVC(Model View ConTroller)
涉及到的三个角色如下:
Model:
模型保存应用程序的数据,定义了怎么去操作它.
The object that holds your application data and defines how to manipulate it.
View:
视图是模型的可视化表示以及用户交互的控件;基本上来说,所有的 UIView对象以及它的子类都属于视图。
The objects that are in charge of the visual representation of the Model and the controls the user can interact with; basically, all the UIViews and their subclasses.
Controller:
控制器是一个协调所有工作的中介者(Mediator)。它访问模型中的数据并在视图中展示它们,同时它还监听事件和根据需要操作数据。
The controller is the mediator that coordinates all the work. It accesses the data from the model and displays it with the views, listens to events and manipulates the data as necessary.
MVC之间的通信方式-如图所示
控制器可以直接访问模型:将模型直接作为控制器的属性。
控制器可以直接访问视图:将视图直接作为控制器的属性。
模型与视图无法直接访问对方(理想状态下):二者完全解耦,不能引用对方,不能把对方设置为属性。
视图(view)到控制器(controller)的通信:
- target - action机制:用户与视图交互触发控制器的方法。例如:点击按钮后实现视图界面跳转,网络请求,刷新UI等(即UIcontrol或者其子类例如UIButton和UITextfield等)。
// add target/action for particular event. you can call this multiple times and you can specify multiple target/actions for a particular event.
添加target/action用于特定的事件,你可以多次调用此方法也可以为某一个特定事件添加多个target/action
// passing in nil as the target goes up the responder chain. The action may optionally include the sender and the event in that order
传入一个nil作为target会使target出现在响应者链里。
// the action cannot be NULL. Note that the target is not retained.action参数不能为NULL。注意target对象不是被持有的。
- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
- 委托机制(delegate):视图向控制器询问某些自己无法决定的事情,或是让控制器帮助自己做一些自己独立无法完成的事情。 因为控制器才是掌握全局的角色,很多时候视图是无法自己做决定的。例如:表格问控制器:我可以滚动么?然后控制器给予回答告知是否可以继续滚动。 如果表格的高度很小,那么就可以不让它滚动。但是如果表格的高度已经超过了屏幕的高度,这时候如果让它自作主张无法滚动就不好了。(参见苹果关于UITableViewDelegate的示例)
- 数据源机制(dataSource):视图让控制器给它将要显示的数据。例如:音乐的数据存在于模型里,控制器访问模型,从模型里拿到数据后告诉视图如何显示出歌曲。(参见苹果关于UITableViewDatasource的示例))
模型到控制器的通信
- 通知机制(Notification):控制器注册监听某模型Model数据变化的通知,当此模型Model数据变化后向该控制器controller发送通知,告知模型Model变化情况。
- KVO机制(Key-Value Observing):模型Model作为控制器controller的属性,当模型Model属性被修改后,持有此模型Model属性的控制器controller就会检测到数据的改变。