dequeueReusableCellWithIdentifier:forIndexPath:get的indexPath在哪里使用?
Apple的文档中提到了indexPath
参数:
索引路径指定单元格的位置。 当数据源被询问单元时,数据源会收到这些信息,并且应该传递给它。 此方法使用索引路径根据表格视图中单元格的位置执行其他配置。
但是register(Class|Nib):forCellReuseIdentifier:
只指定要使用的重用标识符,而不指定一个或一组索引路径。
我认为,也许UITableViewCell
有一些方法可以在索引路径上得到它的手,所以它可以说,如果在一个部分的第一行,它可以绕过它的角落,但我没有看到它。 在创建时,它所得到的只是它的风格和重用标识符( initWithStyle:reuseIdentifier:
; 在重新使用时,它被告知的是prepareForReuse
。
看到旧的dequeueReusableCellWithIdentifier:
仍然支持,如果它不能依靠有机会去做,它可能会做什么样的基于索引路径的配置?
我查看了“桌面视图编程指南”,但它自iOS 5以来并未更新。
根据WWDC 2012会议200 - 可可触摸新特性,
如果您使用- dequeueReusableCellWithIdentifier:forIndexPath:
将您的单元出列,它将是正确的大小,您将能够在您的单元格的contentView
进行布局 。
这几乎是UIKit工程师Chris Parker的一句话。
直到iOS 6,你必须继承你的UITableViewCell
并覆盖- layoutSubviews
如果你想进行布局调整。 从封装的角度来看,这可能仍然是更好的解决方案 - 但是,有时您只需要进行微调,现在可以在- tableView:cellForRowAtIndexPath:
执行该操作。
dequeueReusableCellWithIdentifier:
和dequeueReusableCellWithIdentifier:indexPath:
之间最重要的区别是它们是不同的方法! 因此他们可以有不同的表现,而且他们也可以。 这与indexPath无关,真的; 我们只需要一种方法来区分它们。
新的方式
特别是,如果您调用dequeueReusableCellWithIdentifier:indexPath:
这表示您正在使用新的iOS 6注册和出队系统。 所以,如果你没有注册这个标识符,你会得到一个很好的崩溃和一个日志消息来解释这个问题。 这个方法永远不会返回零; 它总是返回一个单元格,或者通过创建一个新单元格或通过重新使用单元格。
旧的方式
另一方面,简单和简单的dequeueReusableCellWithIdentifier:
是旧的并且必须是向后兼容的。 如果你没有注册这个标识符,它不会抱怨:它只会返回零,让你高和干。 你必须自己创建单元,就像在过去的糟糕日子里一样。
编辑:但也请参见@svena的答案! 新方法(使用indexPath:
具有我不知道的第二个优点:单元在返回给您时的大小正确。
我相信它用于调用tableView:heightForRowAtIndexPath:
方法,如果存在的话,允许单元格的大小正确。
上一篇: Where does the indexPath of dequeueReusableCellWithIdentifier:forIndexPath: get used?
下一篇: How to refresh a UITableViewController or NSFetchedResultsController?