UITableViewDelegate和UITableViewDatasource混淆

时间:2014-08-18 15:42:02

标签: ios objective-c uitableview uikit

之前我明白了 Delegate 模式仅用于调用delegate instance的事件并获取控件(如size / font / etc ...)。

Datasource 模式仅用于从datasource instance获取数据(如views / title / description / etc ...)

但看起来这是一个很好的错觉,在看了Apple的UITableViewDelegate protocol后我感到困惑,因为

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;

是委托方法(但我认为它们是UITableViewDatasource方法)

这是Apple的脏代码,还是我遗漏了一些重要的东西,了解数据源和委托之间的区别?

修改 谢谢@DBD的好评, 这里更混乱

这是 UITableViewDelegate 方法,它返回用于绘图的视图

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;

此外还有 UITableViewDataSource

中的配置
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;

而且oops,我们可以看到一个返回 UITableViewDataSource

中的视图的方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

我们在此疑问为什么cellForRowAtIndexPath:viewForHeaderInSection:不在 UITableViewDataSource

4 个答案:

答案 0 :(得分:8)

这就是我一直在想的。

UITableViewDataSource是主要数据。该表的实际内容是什么。多少行?第X行的内容是什么?

UITableViewDelegate次要显示数据。它应该有多高,如果它显示在选定的状态,并回电“嘿,我要做某事。”

但是我承认我看到它的一些细节(我不买一些选择)

UITableViewDataSourcetitleForHeaderInSectionUITableViewDelegateviewForHeaderInSection

因此,如果它是纯粹的“数据”标题,那么它就是数据源,但如果包含带有视图的显示包装器,那么它就是委托。但等等,cellForRowAtIndexPath是一个视图,这是数据源的一部分,那么为什么要将viewForHeaderInSection放在委托中呢?虽然我几乎看不到作为数据的“单元格”和作为委托的“标题视图”之间的区别,但我认为将“标题”方法拆分成不同协议的混淆并不可取。我相信很多人可能会反对我,但这只是我的意见。

答案 1 :(得分:2)

我认为这里的关键区别源于你所考虑的和数据。"从您的问题来看,我认为您理解"数据"表示"任何回报值" - 也就是说,返回void的方法是委托方法,返回非void的方法是数据源方法(因为它们会将某些内容传递回发送表视图)。

这有时可能是一个有用的近似值,但这里不准确。表格视图的数据是它显示的内容 - 单元格中的内容,部分的标题等。任何其他信息,包括有关布局(如行高)或显示的信息(如节标题)正确属于委托,因为它不是关于表的内容 - 仅仅是关于如何显示这些内容。

这两者经常是相关的,这就是为什么通常不同的UITableViewController子类同时实现委托和数据源,但想象一下:你可以让一个对象充当数据源并销售单元格,然后有不同的object充当委托,并根据完全不同的标准为您的行提供高度。 (例如,用户可以调整行的大小,例如。您仍然提供每行的内容,但高度 - 代表的职责 - 是从一组非常不同的信息中提取的。)

答案 2 :(得分:1)

dataSourcedelegate都是协议,但它们分为两个术语,以便我们可以更好地了解这些方法的设计目的。

这意味着:

  1. dataSource协议定义了一个API,用于提供delegate提供行为的数据。
  2. dataSource位于模型层中,委托位于控制层中。
  3. 我认为这是正确的前景。

答案 3 :(得分:-1)

我不明白你的观点。

数据源协议方法都与数据相关。委托协议改为有关于单元格外观的方法。