之前我明白了
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
答案 0 :(得分:8)
这就是我一直在想的。
UITableViewDataSource
是主要数据。该表的实际内容是什么。多少行?第X行的内容是什么?
UITableViewDelegate
次要显示数据。它应该有多高,如果它显示在选定的状态,并回电“嘿,我要做某事。”
但是我承认我看到它的一些细节(我不买一些选择)
UITableViewDataSource
有titleForHeaderInSection
。
UITableViewDelegate
有viewForHeaderInSection
。
因此,如果它是纯粹的“数据”标题,那么它就是数据源,但如果包含带有视图的显示包装器,那么它就是委托。但等等,cellForRowAtIndexPath
是一个视图,这是数据源的一部分,那么为什么要将viewForHeaderInSection
放在委托中呢?虽然我几乎看不到作为数据的“单元格”和作为委托的“标题视图”之间的区别,但我认为将“标题”方法拆分成不同协议的混淆并不可取。我相信很多人可能会反对我,但这只是我的意见。
答案 1 :(得分:2)
我认为这里的关键区别源于你所考虑的和数据。"从您的问题来看,我认为您理解"数据"表示"任何回报值" - 也就是说,返回void
的方法是委托方法,返回非void
的方法是数据源方法(因为它们会将某些内容传递回发送表视图)。
这有时可能是一个有用的近似值,但这里不准确。表格视图的数据是它显示的内容 - 单元格中的内容,部分的标题等。任何其他信息,包括有关布局(如行高)或显示的信息(如节标题)正确属于委托,因为它不是关于表的内容 - 仅仅是关于如何显示这些内容。
这两者经常是相关的,这就是为什么通常不同的UITableViewController子类同时实现委托和数据源,但想象一下:你可以让一个对象充当数据源并销售单元格,然后有不同的object充当委托,并根据完全不同的标准为您的行提供高度。 (例如,用户可以调整行的大小,例如。您仍然提供每行的内容,但高度 - 代表的职责 - 是从一组非常不同的信息中提取的。)
答案 2 :(得分:1)
dataSource
和delegate
都是协议,但它们分为两个术语,以便我们可以更好地了解这些方法的设计目的。
这意味着:
dataSource
协议定义了一个API,用于提供delegate
提供行为的数据。dataSource
位于模型层中,委托位于控制层中。我认为这是正确的前景。
答案 3 :(得分:-1)
我不明白你的观点。
数据源协议方法都与数据相关。委托协议改为有关于单元格外观的方法。