dequeueReusableCellWithIdentifier:forIndexPath:的indexPath在哪里使用?

时间:2012-10-03 18:39:16

标签: ios uitableview ios6

Apple的文档说明了indexPath参数:

  

指定单元格位置的索引路径。数据源在被要求提供单元格时会收到此信息,并且应该将其传递给它。此方法使用索引路径根据表视图中单元格的位置执行其他配置。

register(Class|Nib):forCellReuseIdentifier:仅指定要使用的重用标识符,而不是段或一组索引路径。

我想也许UITableViewCell有一些方法可以把它放在索引路径上,所以如果在一个部分的第一行,它可以绕过它的角,但是我没有看到它。在创建时,它获得的只是它的样式和重用标识符(initWithStyle:reuseIdentifier:);在重用时,所有被告知的都是prepareForReuse

看到旧的dequeueReusableCellWithIdentifier:仍然受支持,如果它不能依赖有机会这样做,它可能会做什么样的基于索引路径的配置?

我查看了“表视图编程指南”,但自iOS 5以来它尚未更新。

4 个答案:

答案 0 :(得分:40)

dequeueReusableCellWithIdentifier:dequeueReusableCellWithIdentifier:indexPath:之间最重要的区别在于它们是不同的方法!因此,他们可以表现得不同,他们也可以。这与indexPath无关,真的;我们只需要一种方法来区分它们。

新方式

特别是,如果您致电dequeueReusableCellWithIdentifier:indexPath:,这表明您正在使用新的iOS 6注册和出列系统。因此,如果您未能注册此标识符,您将收到一个很好的崩溃和一条解释该问题的日志消息。这种方法永远不会返回零;它总是通过创建一个单元格或重用一个单元格来返回一个单元格。

旧路

另一方面,简单dequeueReusableCellWithIdentifier:是旧的,必须向后兼容。如果你还没有注册这个标识符,它就不会抱怨:它只会返回nil,让你保持高度干燥。你必须自己创造这个细胞,就像过去一样。

编辑:但请参阅@svena的答案!新的方法(使用indexPath:)具有我不知道的第二个优点:单元格在返回给你时是正确的大小。

答案 1 :(得分:36)

根据 WWDC 2012第200节 - 可可触摸中的新功能

如果您使用- dequeueReusableCellWithIdentifier:forIndexPath:将单元格出列,则正确的大小,您将能够在单元格的contentView内进行布局

这几乎是来自UIKit工程师Chris Parker的一句话。

直到iOS 6,如果您想进行布局调整,则必须继承UITableViewCell并覆盖- layoutSubviews。从封装的角度来看,这可能仍然是更好的解决方案 - 但是,有时您只需要进行微调,现在您可以在- tableView:cellForRowAtIndexPath:中进行调整。

答案 2 :(得分:2)

我相信它用于调用tableView:heightForRowAtIndexPath:方法(如果存在),允许单元格大小正确。

答案 3 :(得分:-2)

我总是认为当UITableViewDelegate方法时,UIKit会在分组表格视图中围绕顶部和底部单元格的角落:

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

被调用。但是,知道索引路径并不常用,除非单元格也知道同一部分中有多少行,因此如果它是最后一个单元格,它可以解决。

我假设添加方法dequeueReusableCellWithIdentifier:的索引路径是为了提高性能,可能是因为@jrturton建议使用不同的重用池,或者只是确定单元格在分组部分中的位置。

据我记得WWDC视频,在iOS 6中添加了一些额外的方法来支持单元格的重新排序,插入和删除,所以这也可能是这里的因素?