gpt4 book ai didi

iphone - MVC,了解模型的 View

转载 作者:行者123 更新时间:2023-12-03 19:41:32 25 4
gpt4 key购买 nike

这可能是一个愚蠢的问题,但在 MVC 中, View 并不了解模型的正确性。我查看了 TableView 单元格的一些示例,并且 TableView 单元格具有模型对象的属性。然后,它使用该模型的属性来填充标签或单元格的图像。

或者在另一种情况下,如果我有一个 UIView 来根据模型动态绘制某些内容,那么在 UIView 上拥有一个属性似乎是最简单的,这样 UIView 就可以访问该模型的数据来绘制它动态地。所以我可以做这样的事情:

myView.object = newObject;
[myView setNeedsDisplay];

这对于 MVC 来说是错误的吗?如果是这样,做这两件事的更好方法是什么?谢谢。

最佳答案

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 .

我从中得到的主要观点是 View 不应直接链接到模型。请参见此图:

Apple diagram of Cocoa MVC pattern

您提到 UITableViewCells 经常具有 Model 对象的属性 - 我认为这是错误的。模式应如下所示:

  • 模型处理所有实际的数据存储和管理
  • View 知道正在显示的数据的类型,但不知道数据本身。
  • Controller (UITableViewController) 是从模型获取数据并设置 View 的“粘合剂”

这在实践中是如何运作的?

请原谅以下伪代码中的一些错误,因为我只是直接输入它,我还没有对其进行任何测试,但希望它能说明问题。

所以你有一个 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;
}

总之, View 对实际数据一无所知 - 它只知道它必须显示一个人的姓名和电话号码。它不知道后端存储是什么 - 它可能是核心数据、文件、下载并解析的 JSON 等。它不知道有关 模型 的任何信息 - 例如,也许它存储了有关此人的其他数据,也许电话号码实际上存储在与名称不同的模型中。 Controller 处理所有这些工作。

为什么要这样做?

因此,您推出上述应用程序,然后发现您的模型速度非常慢 - 您可以将其更换为完全不同的模型,而无需触摸 View 。也许您可以让其他开发人员或设计人员创建 View - 他们需要知道的是它必须显示两位文本。基本上,它使您的代码干净、分区清晰、易于扩展且易于重构。

现在,只要您在 UITableViewCell View 中执行类似的操作,所有这些都会消失:

@property (strong) Person *person;

关于iphone - MVC,了解模型的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11675709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com