委托模式仅用于调用事件以委托实例和获取控件(如size / font / etc …).
数据源模式仅用于从数据源实例获取数据(如views / title / description / etc …)
但看起来这是一个很好的错觉,在看了Apple的UITableViewDelegate协议后,我感到困惑,因为
- (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是辅助和显示数据.它应该有多高,如果它显示在选定的状态,并回电“嘿,我要做某事.”
但是我承认我看到它的一些细节(我不买一些选择)
UITableViewDataSource具有titleForHeaderInSection.
UITableViewDelegate具有viewForHeaderInSection.
因此,如果它是纯粹的“数据”标题,那么它就是数据源,但是如果包含带有视图的显示包装器,那么它就是委托.但是等一下,cellForRowAtIndexPath是一个视图,它是数据源的一部分,那你为什么要把viewForHeaderInSection放在委托中呢?虽然我几乎看不到作为数据的“单元格”和作为委托的“标题视图”之间的区别,但我认为将“标题”方法拆分为不同协议的混淆并不可取.我相信很多人可能会反对我,但这只是我的看法.