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;