View:继承至UIView,负责展示内容(视图类比如UILabel)、以及接受用户输入Event(控件类比如UIButton)。
1.UIView中的控件类只是接受到了Event,但是它不知道如何响应该Event。Controller知道如何响应。IOS中采取[目标-动作]机制完成响应函数调用。当UIButton接受到用户按下的Event,它便向Controller(Target)发送消息,Controller收到消息后,会执行action。这过程通常在storyboard中手动连线完成。也可以采用编写code(这取决于UI生成的方法,是code创建还是通过storyboard)。在-(void)viewDidLoad中:
2. 视图类被用户操作时,需要考虑三个问题will(将要被)、should(可以被) 、did(正在被),要回答这三个问题。视图类委托权利给控制器来处理。
这种两个对象之间的通信方式称为“委托设计模式”。IOS中使用协议如UITextFieldDelgate(相当于其他语言接口)。
protocol:两个对象之间的盲通信。(这里的盲,体现在id是可以指向任意NSObject对象,两个需要通信的对象,都不必了解各自的细节)。
拿代码来说明,典型的视图类包含一个delegate属性:
@interface MyView:UIView
@property(nonatomic,weak)id
@end
在控制器中创建这个视图的时候,会进行如下操作:
-(void)viewDidLoad
{
_nameT = [[UITextField alloc]initWithFrame:CGRectMake(20, 100, 100, 30)];
_nameT.delegate = self; //将控制器 设置为 视图类的 委托
[self.view addSubview:_nameT]; //view拥有对象UITextField,strong
}
这个过程如图所示:
PS:这个过程也解释了
@property (weak, nonatomic) IBOutlet UITextField *textField;
为什么’插座变量’要使用weak,因为控制器和视图类相互持有对方的引用。为了避免循环引用带来的memory leak。
另一种委托模式的应用,叫DataSource。视图不拥有它要显示的数据(比如UITableView),视图需要向控制器请求需要显示的数据。UITableVIewDataSource协议
- -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Controller: View与Model之间不能直接通信(这样的设计满足程序的数据与显示隔离),需要Controller来在中间协调。各种相关的ViewController(不同的控制器实现了不同种类的协议),主要负责Model 与 View之间的同步。
控制器同时持有,View的引用(IBOutlet)和Model的引用。
Model:利用IOS提供的基础框架,及Objective-C面向对象的技术,对app的业务逻辑建模。如此Model其实就是代表了这个app是什么。