IOS中MVC模型详解(一)

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<myProtocol>  delegate;

@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协议

  1. -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  2. -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  3. -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Controller: View与Model之间不能直接通信(这样的设计满足程序的数据与显示隔离),需要Controller来在中间协调。各种相关的ViewController(不同的控制器实现了不同种类的协议)主要负责Model 与 View之间的同步。

控制器同时持有,View的引用(IBOutlet)和Model的引用。

Model:利用IOS提供的基础框架,及Objective-C面向对象的技术,对app的业务逻辑建模。如此Model其实就是代表了这个app是什么。

posted @ 2015-11-23 16:48  yytiger  阅读(573)  评论(0编辑  收藏  举报