我想符合模式 MVC,我问我,“cellForRowAtIndexPath”方法必须去哪里:/因为目前,这个方法在控制器文件中。
2 回答
你问它是否应该在模型(M)或控制器(C)中,我假设。这是一个有趣的问题,因为 UITableView 有两个协议:
UITableViewDelegate
UITableViewDataSource
好吧,UITableViewDelegate 协议适用于视图的“所有者”,通常是控制器——我没有看到任何其他假设的代码。
那么 UITableViewDataSource 应该放在哪里呢?这是定义的协议
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
现在,如果 Apple 开发人员认为它会进入 Controller,为什么不直接将其合并到 UITableViewDelegate 协议中呢?文档是这样说的(用我的粗体字):
UITableViewDataSource 协议被一个对象采用,该对象为 UITableView 对象调解应用程序的数据模型。数据源为表视图对象提供构造和修改表视图所需的信息。
作为数据模型的代表,数据源提供了关于表格视图外观的最少信息。表视图对象的委托——一个采用 UITableViewDelegate 协议的对象——提供了该信息。
所以这似乎表明它应该位于模型中 - 但实际上通过说“调解应用程序的数据模型”意味着它应该位于控制器中 - 但可能不是实际管理UITableView
(通过UITableViewDelegate
协议)的同一个控制器。在我看来,您可以灵活地以几种不同的方式进行布局 - 但是一般的结论是,在我见过的 99% 的代码中,它位于也是UITableViewDelegate
委托的 Controller 中。
这是关于 MVC 的一些 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
控制器对象(MVC 中的 C)的目标是协调模型对象和视图对象。因此,cellForRowAtIndexPath 方法的性质,它用数据(来自模型)填充给定的单元格(这是一个视图)决定它属于控制器。
这种方法在 Apple 与 UITableViews 和 UITableViewControllers 相关的所有示例代码中都得到了演示。