UITableViewDelegate和UITableViewDatasource混淆

我在那之前就明白了
Delegate模式仅用于调用事件来delegate instance和获取控件(如大小/字体/等等...)。

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

但看起来这是一个很好的幻想,看着苹果的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方法,返回View的绘图

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

并且在UITableViewDataSource中还有一个配置

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;

而且,我们可以看到一个方法,它在UITableViewDataSource中返回一个View

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

这里我们有疑问为什么cellForRowAtIndexPath:viewForHeaderInSection:不在UITableViewDataSource中


这是我一直想到的。

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

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

不过,我承认我把它看成是一条细线(我不买一些选择)

UITableViewDataSourcetitleForHeaderInSectionUITableViewDelegate具有viewForHeaderInSection

因此,如果它是纯粹的“数据”标题,那么它就是数据源,但是如果包含具有视图的显示包装器,则它就是代表。 但是,等待, cellForRowAtIndexPath是一个视图,这是数据源的一部分,那么为什么你会把viewForHeaderInSection放在委托中? 虽然我几乎不能区分作为数据的“单元”和作为代表的“标题视图”,但我认为将“标题”方法分解为不同协议的混淆并不可取。 我相信很多人可能会不同意我的看法,但这只是我的看法。


我认为这里的重要区别来自你认为的“数据”。 从你的问题来看,我认为你理解“数据”是指“任何返回值” - 也就是说,返回void的方法是委托方法,返回非void的方法是数据源方法(因为它们将某些东西传递回发送表视图)。

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

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


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

意即:

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

    链接地址: http://www.djcxy.com/p/66865.html

    上一篇: UITableViewDelegate and UITableViewDatasource confusion

    下一篇: iOS7: How to implement Section Index like Contacts on iOS7?