Apple的文档说明了indexPath
参数:
指定单元格位置的索引路径。数据源在被要求提供单元格时会收到此信息,并且应该将其传递给它。此方法使用索引路径根据表视图中单元格的位置执行其他配置。
但register(Class|Nib):forCellReuseIdentifier:
仅指定要使用的重用标识符,而不是段或一组索引路径。
我想也许UITableViewCell
有一些方法可以把它放在索引路径上,所以如果在一个部分的第一行,它可以绕过它的角,但是我没有看到它。在创建时,它获得的只是它的样式和重用标识符(initWithStyle:reuseIdentifier:
);在重用时,所有被告知的都是prepareForReuse
。
看到旧的dequeueReusableCellWithIdentifier:
仍然受支持,如果它不能依赖有机会这样做,它可能会做什么样的基于索引路径的配置?
我查看了“表视图编程指南”,但自iOS 5以来它尚未更新。
答案 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中添加了一些额外的方法来支持单元格的重新排序,插入和删除,所以这也可能是这里的因素?