Ios UITableViewDelegate和UITableViewDatasource混淆

Ios UITableViewDelegate和UITableViewDatasource混淆,ios,objective-c,uitableview,uikit,Ios,Objective C,Uitableview,Uikit,我之前就明白了 委托模式仅用于调用事件到委托实例并获取控件(如大小/字体等) 数据源模式仅用于从数据源实例获取数据(如视图/标题/说明等) 但这似乎是一个很好的错觉,在看了苹果的UITableViewDelegate协议之后,我感到困惑,因为 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; - (CGFloat)tableView:(UITableVie

我之前就明白了
委托
模式仅用于调用事件到
委托实例
并获取控件(如大小/字体等)

数据源
模式仅用于从
数据源实例
获取数据(如视图/标题/说明等)

但这似乎是一个很好的错觉,在看了苹果的
UITableViewDelegate协议之后,我感到困惑,因为

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
是委托方法(但我认为它们是
UITableViewDatasource
方法)

这是一个来自苹果的脏代码,还是我遗漏了一些重要的东西来理解datasource和delegate之间的区别

编辑: 谢谢@DBD的好回答, 这里有更多的困惑

下面是返回绘图视图的UITableViewDelegate方法

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section; -(UIView*)tableView:(UITableView*)用于标题的tableView视图部分:(NSInteger)部分; 而且,UITableViewDataSource中也有一个配置

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; -(NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section; 面向对象,我们可以在UITableViewDataSource

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath;
这里我们有一个问题,为什么
cellforrowtaindexpath:
viewForHeaderInSection:
不在UITableViewDataSource

我不理解你的观点


数据源协议方法都与数据相关。代表协议有关于细胞外观的方法。

< P>我认为这里的关键区别来自于你所考虑的“数据”。从你的问题中,我认为你理解“数据”是指“任何返回值”——也就是说,返回<代码>空白>代码>的方法是委托方法,返回non-
void
的方法是数据源方法(因为它们将某些内容传递回发送表视图)

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


这两者通常是相关的,这就是为什么同一个UITableViewController子类通常同时实现委托和数据源的原因,但是想象一下:您可以使用一个对象作为数据源和vend单元格,然后让另一个对象作为代理,并根据完全不同的标准为行提供高度。(例如,想象一个用户可以调整行大小的表格。您仍然提供每行的内容,但高度(代表的责任)是从一组非常不同的信息中提取的。)
数据源
委托
都是协议,但它们被分为两个术语,以便我们更好地理解这些方法的设计目的

这意味着:

  • dataSource
    协议定义了一个API,该API提供了
    delegate
    提供行为的数据
  • dataSource
    位于模型层,委托位于控制层

  • 我认为这是正确的观点。

    这是我一直以来的想法

    UITableViewDataSource
    将作为主要数据。表中的实际内容是什么。有几排?第X行的内容是什么

    UITableViewDelegate
    是辅助和显示数据。它应该有多高,应该在选定的状态下显示,并回拨“嘿,我要做点什么了。”

    然而,我承认,我把其中一些看作是一条细线(我不买一些选择)

    UITableViewDataSource
    具有标题为标题部分的
    UITableViewDelegate
    具有
    viewForHeaderInSection


    因此,如果它是纯“数据”标题,则它是数据源,但如果包含带有视图的显示包装器,则它是委托。但是等等,
    cellforrowatinexpath
    是一个视图,它是数据源的一部分,那么为什么要在委托中放置
    viewForHeaderInSection
    ?虽然我几乎看不到作为数据的“cell”和作为委托的“title view”之间的区别,但我认为将“title”方法拆分为不同协议的混淆是不可取的。我相信很多人可能不同意我的观点,但这只是我的观点。

    在看到苹果的文件之前,我对你也有同样的困惑

    UITableViewDataSource协议由以下对象采用: 调解UITableView对象的应用程序数据模型。这个 数据源为表视图对象提供它所需的信息 需要构造和修改表视图

    作为数据模型的代表,数据源提供 关于表视图外观的最少信息。表视图 对象的委托采用UITableViewDelegate的对象 协议提供了这些信息


    它们不是数据源方法,因为它们不向表视图提供任何数据。它们只是确定行/页眉/页脚的高度。@Nick但数据是从委托传输到tableView的?@IOgg3r数据来自数据源,而不是委托。然而,我们经常让数据源和委托是同一个对象,通常是表视图控制器。有人可能会说它应该以另一种方式实现,但事实并非如此。不过,这并不重要,因为大约95%的时间使用同一个类来实现这两个delega - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;