自定义表格单元重用/出列
Posted
技术标签:
【中文标题】自定义表格单元重用/出列【英文标题】:Custom Table Cell Reuse / Dequeue 【发布时间】:2013-04-04 14:02:59 【问题描述】:我知道以前曾发布过类似的问题,但我在其中找不到适合我的解决方案,所以请多多包涵...
我在 xcode 中有一个带有自定义表格单元格的表格视图。单元格目前只不过是一个标签:
SiteFileCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
cell.fileNameLabel.text = [self.listDir.filesInfo objectAtIndex:indexPath.row];
这很好用。我本质上是在做一个目录钻取结构。当我选择一个单元格时,它会通过将新的表格视图推送到导航控制器堆栈并重新加载所有表格单元格来进入下一个级别。
此时我看到一个经常报告的错误:
无法使具有标识符 Cell 的单元出列 - 必须为标识符注册一个 nib 或一个类,或者连接情节提要中的原型单元
因此,经过研究,我看到了我应该注册类型的建议:
[self.tableView registerClass:[SiteFileCell class] forCellReuseIdentifier:@"FileCell"];
如果我这样做,效果会很好,但所有单元格都不会显示任何标签!
我已经看到一些关于在单元类的 initWithStyle 方法中可能需要自定义代码的参考,但我不太清楚那里需要什么,所以有人可以给我更多的指针吗?
【问题讨论】:
能否请您发布整个 cellForRowAtIndexPath 方法。 你应该实例化你的单元格,就像 if ( cell == nil ) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 还有,你去关卡的时候,是不是用同一个tableView? 如果您在 Interface Builder 中创建自定义单元格,您可以在那里设置标识符,它会正常工作。 这个问题的答案取决于您创建自定义单元格的位置,那么您是在哪里创建的,xib、故事板或代码? 【参考方案1】:而不是注册一个 class 注册一个 nib。该笔尖是您设计表格视图单元格子类的笔尖。它只包含一个***对象,即单元格,并且该单元格已被指定为 SiteFileCell。 Presto,一切都会好起来的。
在我的书中查看完整的解释(带有可下载的代码):
http://www.apeth.com/iosBook/ch21.html#_custom_cells
见特别。 “设计笔尖中的单元格”小节。
【讨论】:
这绝对有效 - 仍然不确定为什么我最初在情节提要中使用设计的单元格没有问题但是当我以编程方式推送新的 tableview 控制器时,我必须更改为使用笔尖......但它有效至少,非常感谢! 因为您没有从情节提要中获得“新的 tableview 控制器”。您可以使用情节提要“原型”功能在情节提要中设计单元格,但前提是您的 UITableViewController 来自情节提要。你可以这样做——制作一个故事板,在其中设计你的 UITableViewController,给它一个标识符,然后用instantiateViewControllerWithIdentifier:
取出它。但是一旦您决定以某种其他方式实例化您的 UITableViewController,您就放弃了该功能。
再次,请阅读我的书:apeth.com/iOSBook/ch21.html#_custom_cells 它解释了获取自定义单元格的所有可能方式。
是的@matt,我已经阅读了它,但我仍然不明白为什么在一个实例中它与自定义单元格一起工作,而在另一个实例中我需要使用NIB - 这意味着两者都应该没问题......
“实例”是有效词。这完全取决于此单元实例的来源。您在这方面给出了表格视图说明。如果单元格实例来自一个 nib,则为该 nib 注册。如果直接实例化类就足够了,则注册该类。在您的情况下,您已使用笔尖为fileNameLabel
绘制出口连接,因此如果您希望该出口属性起作用,则必须加载笔尖。否则fileNameLabel
为零。【参考方案2】:
如果您将 XIB 用于单元格,则只能在 XIB 文件中设置标识符。
【讨论】:
以上是关于自定义表格单元重用/出列的主要内容,如果未能解决你的问题,请参考以下文章
从可重用单元中出列时,自定义 CollectionViewCell 上会触发啥方法?