MVC 模型有不同的变体——关于 Cocoa 的 Apple 文档在这里:http: //developer.apple.com/library/mac/documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View -Controller.html#//apple_ref/doc/uid/TP40010810-CH14-SW9。
我从中得到的主要内容是视图不应该直接链接到模型。看这张图:
您经常提到UITableViewCells
具有Model对象的属性-我认为这是错误的。模式应如下所示:
- 模型处理所有实际的数据存储和管理
- View知道正在显示的数据类型,但不知道数据本身。
- 控制器(UITableViewController)是从模型中获取数据并设置视图的“粘合剂”
这在实践中如何运作?
请原谅以下伪代码中的一些错误,因为我只是直接输入了它,我没有测试过它,但希望它说明了这一点。
所以你有一个UITableViewCell
看起来像这样的子类:
@interface PhoneEntryTableViewCell {
@property (weak) IBOutlet UILabel *personName;
@property (weak) IBOutlet UILabel *phoneNumber;
}
模型如下所示:
@interface PhoneModel {
@property (strong) NSMutableArray *listOfPeople;
}
并UITableViewController
实现标准UITableViewDelegate
/UITableViewDataSource
方法,例如:
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath {
Person *person = [myModel personForIndex:indexPath.row];
PhoneEntryTableViewCell *cell = [self dequeueReusableCellWithIdentifier:@"PhoneCell"];
cell.personName.text = [person name];
cell.phoneNumber.text = [person phoneNumber];
return cell;
}
所以总而言之,视图对实际数据没有任何想法——它只知道它必须显示一个人的姓名和电话号码。它不知道后端存储是什么——它可能是核心数据、文件、下载和解析的 JSON 等。它对模型一无所知——例如,它可能存储关于模型的其他数据人,也许电话号码实际上存储在与名称不同的模型中。控制器处理所有这些工作。
为什么要这样做?
因此,您推出上述应用程序,然后发现您的模型非常慢 - 您可以将其换成完全不同的模型,而无需接触View。也许您可以让其他开发人员或设计师创建视图- 他们只需要知道它必须显示两位文本。基本上,它允许您的代码干净、清晰分区、易于扩展且更易于重构。
现在,只要您在UITableViewCell
视图中执行此类操作,所有这些都会消失:
@property (strong) Person *person;