将UITableViewDelegate和DataSource放在MVC中的位置?

时间:2010-12-08 17:14:26

标签: iphone objective-c cocoa-touch

就MVC而言,我有一个在我的控制器中实例化的UITableView和一个充当UITableViewDelegate&的模型对象。 UITableViewDataSource。当我设置委托和数据源时,我只是添加了两个指向模型:

    // INSIDE CONTROLLER
[tableView setDelegate:dataModel];
[tableView setDataSource:dataModel];

数据源适合模型,感觉正确。但代表是模型中最好的(因此它与DataSource一样)或者(在MVC术语中)是否更适合控制器?

    // INSIDE CONTROLLER
[tableView setDelegate:self];
[tableView setDataSource:dataModel];

编辑: 我应该澄清一下,我的模型对象包含一个NSMutableArray,它保存我希望在UITableView中显示的数据(因此我将DataSource设置为模型)。这似乎很有效,因为我可以直接从模型中填充UITableView。

3 个答案:

答案 0 :(得分:4)

通常的做法是使视图控制器成为委托和数据源,使其符合UITableViewDelegate和UITableViewDataSource,或者让它成为UITableViewController的子类(您将注意到,它符合这些协议本身)。当然,为控制器提供实际数据的代码应保留在模型层中。

为了响应您的编辑,您的模型类可以将NSMutableArray公开为属性,您的表的视图控制器可以轻松访问它。

答案 1 :(得分:3)

Apple的UITableViewDelegate文档似乎在帮助视图布局等方面描述了表视图委托。不幸的是,在实践中两者之间存在一些混淆,例如委托返回动态行高(即使数据源返回单元格),或委托返回部分页眉和页脚视图(即使数据源可以只是返回普通标题)。

这样的问题使得很难将表视图(您需要调用reloadData)与其数据源以及来自委托的数据源完全分开。如果可能的话,如果同一个对象的功能与数据源委托一样,那么这是最简单的。当不可能时,委托通常最有意义,因为视图控制器管理表视图的表示。

答案 2 :(得分:1)

UITableViewDelegate负责更多面向GUI的内容,因此包含表视图的视图控制器是视图委托的最佳候选者,数据源无法与GUI相关,但通常和所有苹果示例相关它们绑定控制器,包含表视图作为两者,因此在苹果样本的情况下它看起来像(从表视图控制器或在IB中): YourTableViewController.m

[self.tableView setDelegate:self];
[self.tableView setDataSource:self];