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,插入和删除,所以这也许会成为一个因素呢?