UITableViewDelegate中代理方法的应用场景整理(一)

目录

主要的方面有:

接下来是对具体的每个方法的讲解:

行设置

响应行选择

页眉页脚以及行高的设置

管理附件视图

管理上下文菜单

未完待续~


按照一贯的对知识点的整理,大家可以跟着我的逻辑由总到分由整体到部分的思路进行理解。

首先,UITableViewDelegate协议是什么?在苹果官方文档中对他进行了简洁而又明确的定义:“Methods for managing selections, configuring section headers and footers, deleting and reordering cells, and performing other actions in a table view.” 我的理解是UITableViewDelegate协议包含了对选择的管理,对块的header以及footer的设置,删除单元格或者对单元格重排序,以及在表视图中表现其它的操作。

主要的方面有:

  1. 创建和管理自定义的页脚页头视图。
  2. 为行,header以及footer自定义高度。
  3. 为更好的滚动支持提供高度估计。
  4. 设置行内容的缩进。
  5. 响应行点击。
  6. 对在表格行中间的滑动以及其他操作进行响应。
  7. 支持编辑表格中的内容。

在表格视图中,使用的是NSIndexPath对象对行和单元进行指定。

 


接下来是对具体的每个方法的讲解:

行设置

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath *)indexPath;

 参数:

  • tableView:tableView把即将要发生的事件通知给代理。
  • cell:指的是表视图将要使用来绘制行的单元格。
  • indexPath:为行在表视图中定位。

表视图会在对Cell绘制行之前将消息发送到实现代理的委托中,委托在的方法中:实现单元对象的自定义,以及选择和背景颜色的操作等。

 

- (NSInteger)tableView:(UITableView *)tableView 
indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath;

返回值:返回制定行的深度,现实它在这个块中的层次结构位置。

 

- (BOOL)tableView:(UITableView *)tableView 
shouldSpringLoadRowAtIndexPath:(NSIndexPath *)indexPath 
      withContext:(id)context;

参数:context:Spring加载行为的上下文对象,可以对这个对象进行修改,为行为中指定的Spring-Loaded对象指定位置。(这里如果没有知名的话就会在整个行上进行Spring-loaded,当我们需要有选择的禁用使就要使用上细纹对象将Spring-Loaded动画应用于行的单个子视图)

返回值:该行是否允许Spring-Loaded的交互。


响应行选择

Overview:

- tableView:willSelectRowAtIndexPath:
告诉delegate将要选择的行。

- tableView:didSelectRowAtIndexPath:
告诉delegate选中一行。

- tableView:willDeselectRowAtIndexPath:
告诉delegate即将取消选择指定的行。

- tableView:didDeselectRowAtIndexPath:
告诉delegate现在取消选择指定的行。

- tableView:shouldBeginMultipleSelectionInteractionAtIndexPath:
询问delegate用户用户是否可以使用两指平移手势来选择表格视图中的多个项目。

- tableView:didBeginMultipleSelectionInteractionAtIndexPath:
告诉delegate用户何时开始使用两指平移手势在表视图中选择多行。

- tableViewDidEndMultipleSelectionInteraction:
告诉delegate用户何时停止使用两指平移手势在表视图中选择多行。

Details:

- (NSIndexPath *)tableView:(UITableView *)tableView 
  willSelectRowAtIndexPath:(NSIndexPath *)indexPath;

返回值:确认过更改所选行的索引路径。当你想要其他的单元格被选中的话返回一个新的NSIndexPath;如果你不想这个行被选择的话,返回nil。

使用场景:

系统会在用户抬起手指之后调用这个方法,并且被触摸的行会突出显示,可以通过设置UITableViewCellSelectionStyleNone取消突出显示。当行不可选择的时候,系统将不调用这个方法。


- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

这是比较重要的一个方法,代理会在这个方法中对这个被选择的行进行操作。当操作的行不可选择,则系统不调用该方法。


- (void)tableView:(UITableView *)tableView 
didDeselectRowAtIndexPath:(NSIndexPath *)indexPath;

使用该方法处理取消行需要完成的操作。


- (NSIndexPath *)tableView:(UITableView *)tableView 
willDeselectRowAtIndexPath:(NSIndexPath *)indexPath;

返回:返回一个索引地址用来确认或者更改取消选择的行。

这方法只有在存在现有选择时而用户此时又尝试选择其他行时,系统才会调用此方法。方法返回一个新的NSIndexPath而不是indexPath时,表示你想要取消选择第二个选择项,如果想要设置该行不被选择,则返回nil。


苹果官方文档对于更改和突出显示单元格的外观有一个很详细的文档,点击这里跳转。

在行中还有一种情况就是用户使用两个手指进行多行操作。这里由于我还没遇到这中情景所以不展开说了。主要的理念为首先在should中设置是否启用这个功能,在did中进行具体操作的编写,在end中告知完成,处理完成之后的操作。在用户正在进行的时候会调取did方法,在这里可以实现比如将选择按钮转换成完成跟那个按钮。在手指抬起的时候会调取end方法。具体细节可以参考官方文档。


页眉页脚以及行高的设置

- (CGFloat)tableView:(UITableView *)tableView 
heightForRowAtIndexPath:(NSIndexPath *)indexPath;

为目标表格的指定行设置一个非负的数值作为高度。在表格的高度不是固定的值的时候重载这个方法。在表格出现在屏幕上之前是,表格视图针对可见部分的项目调用这个方法,当用户滚动式,只有并且只要项目移动到屏幕上的时候才会调用这个方法。


- (CGFloat)tableView:(UITableView *)tableView 
heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView 
heightForFooterInSection:(NSInteger)section;

为指定的表格视图的指定section设置页头/脚高度。使用这个方法来为由

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

这两个方法返回的Header/Footerview,定义表头/脚的高度。


- (CGFloat)tableView:(UITableView *)tableView 
estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath;

为请求的表视图的指定行返回一个非负的估计高度,如果没有的话,返回UITableViewAutomaticDimension。

用处官方文档说了一堆,总结一下就是节省了他去计算你真实高度的时间,在加载的时候可以减少加载时间。

相似的用法还有:

- (CGFloat)tableView:(UITableView *)tableView 
estimatedHeightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView 
estimatedHeightForFooterInSection:(NSInteger)section;

管理附件视图

 

- (void)tableView:(UITableView *)tableView 
accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;

参数:

tableView:通知代理事件发生的表视图。

indexPath:细节按钮被点击的行的索引地址。

当且仅当行的附加视图的细节按钮被点击的时候,表视图调用此方法。对于其他的附加视图类型,表视图不调用此方法。


管理上下文菜单

 

- (UIContextMenuConfiguration *)tableView:(UITableView *)tableView 
contextMenuConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath 
                                    point:(CGPoint)point;

参数:

tableView:包含这个行的表视图。

indexPath:行的索引地址。

point:在表的坐标空间的相互作用的地址。

返回值:返回该行在某个点上的上下文菜单配置。返回nil表示从开始就禁止相互作用;返回一个空的配置来开始交互然后以一个取消效果作为失败。使用空配置向用户指示此元素可以显示菜单,但是不存在任何操作。

使用场景:使用这个方法提供要显示的菜单的UIcontextMenuConfigration说明。


未完,点击转下篇

你可能感兴趣的:(ios)