就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。
答案 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];