何时使用dequeueReusableCellWithIdentifier vs dequeueReusableCellWithIdentifier:forIndexPath

Jaj*_*ris 158 objective-c ios swift

dequeueReusableCellWithIdentifier有两个重载,我试图确定何时使用一个与另一个相比?

关于forIndexPath函数的apple文档声明:"此方法使用索引路径根据表格视图中单元格的位置执行其他配置."

我不知道怎么解释这个?

rob*_*off 207

最重要的区别是,forIndexPath:如果没有为标识符注册类或nib ,则版本断言(崩溃).在这种情况下,旧的(非forIndexPath:)版本返回nil.

您可以通过发送registerClass:forCellReuseIdentifier:到表视图来注册标识符的类.您可以通过发送registerNib:forCellReuseIdentifier:到表视图来注册标识符的nib .

如果您在故事板中创建表视图和单元格原型,则storyboard加载程序负责注册您在故事板中定义的单元格原型.

第200节 - 来自WWDC 2012的Cocoa Touch的新内容讨论了从8月30日开始的(当时是新的)forIndexPath:版本.它说"你将永远得到一个初始化的单元格"(没有提到如果你没有注册一个类或nib就会崩溃).

该视频还说"它将是该索引路径的正确大小".据推测,这意味着它将在返回之前设置单元格的大小,方法是查看表格视图自身的宽度并调用委托tableView:heightForRowAtIndexPath:方法(如果已定义). 这就是它需要索引路径的原因.


Goo*_*33d 37

dequeueReusableCellWithIdentifier:forIndexPath:永远返回一个单元格.它要么重新使用现有单元格,要么创建一个新单元格,如果没有单元格则返回.

dequeueReusableCellWithIdentifier:然而,传统将返回一个单元格,如果它存在,即如果有一个可以重复使用的单元格,它返回其他返回零.所以你必须写一个条件来检查nil价值.

dequeueReusableCellWithIdentifier:如果您想支持iOS 5及更低版本,请回答您的问题,因为dequeueReusableCellWithIdentifier:forIndexPath仅适用于iOS 6+

参考:https://developer.apple.com/library/ios/documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier : forIndexPath:


rde*_*mar 6

我从来没有理解为什么Apple创建了更新的方法,dequeueReusableCellWithIdentifier:forIndexPath:.他们关于它们的文件并不完整,有些误导.我能够在两种方法之间区分的唯一区别是,如果找不到传入标识符的单元格,那么旧方法可以返回nil,而新方法崩溃,如果它不能返回一个细胞.如果已正确设置标识符,则保证两种方法都返回单元格,并在故事板中创建单元格.如果您注册类或xib,并且使用代码或xib文件创建单元格,这两种方法也可以保证返回单元格.

  • 新方法使用索引路径来确定单元格的正确大小. (3认同)
  • 如果我提供“ tableView.estimateHeight”,则单元格的大小也会正确确定。我仍然没有从新方法中受益。 (2认同)