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

苹果的文档说到indexPath参数:

索引path指定单元格的位置。 数据源收到这个信息,当它被要求的单元格,应该只是通过它。 此方法使用索引path根据表格视图中单元格的位置执行其他configuration。

但是register(Class|Nib):forCellReuseIdentifier:只指定要使用的重用标识符,而不是一个或一组索引path。

我想也许UITableViewCell有一些方法可以把它放在索引path上,所以如果在一个部分的第一行,它可以说是圆angular,但是我没有看到它。 在创build时,它所得到的是它的风格和重用标识符( initWithStyle:reuseIdentifier: ; 在重新使用的时候,所有被告知的是prepareForReuse

看到旧的dequeueReusableCellWithIdentifier:仍然被支持,如果它不能依靠有机会这样做,它可能会做什么样的基于索引path的configuration?

我查看了“桌面视图编程指南”,但从iOS 5开始并没有更新。

根据WWDC 2012会议200 – Cocoa Touch的新function

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

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

直到iOS 6,你必须inheritance你的UITableViewCell并覆盖- layoutSubviews如果你想进行布局调整。 从封装的angular度来看,这可能仍然是更好的解决scheme – 但是,有时你只需要一个微小的调整,现在你可以在- tableView:cellForRowAtIndexPath:做到这一点。

dequeueReusableCellWithIdentifier:dequeueReusableCellWithIdentifier:indexPath:之间最重要的区别是它们是不同的方法! 因此,他们可以有不同的行为,他们也可以。 这跟indexPath无关,真的; 我们只需要一种方法来区分它们。

新的方式

特别是,如果你调用dequeueReusableCellWithIdentifier:indexPath:这是一个标志,你正在使用新的iOS 6注册和出队系统。 所以,如果你没有注册这个标识符,你会得到一个很好的崩溃和一个日志消息来解释这个问题。 这个方法永远不会返回零; 它总是返回一个单元格,通过创build一个新的单元格或通过重用它。

旧的方式

另一方面,简单和简单的dequeueReusableCellWithIdentifier:是旧的,并且必须是向后兼容的。 如果你没有注册这个标识符,它不会抱怨:它只会返回零,让你高和干。 就像在过去的糟糕时代一样,你必须自己创造一个单元。

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

我相信这是用来调用tableView:heightForRowAtIndexPath:方法,如果存在,允许单元格的大小正确。

我一直以为UIKit会在UITableViewDelegate方法的时候在一个分组表格视图中围绕顶部和底部单元格的angular落:

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

叫做。 然而,知道索引path是没有太大的用处,除非单元格也知道在同一节中有多less行,所以如果它是最后一个单元格,它可以计算出来。

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

就我所记得的WWDCvideo而言,在iOS 6中增加了一些额外的方法来支持单元格的重新sorting,插入和删除,所以这也许会成为一个因素呢?