UITableViewCell 对象不调用 awakeFromNib

Posted

技术标签:

【中文标题】UITableViewCell 对象不调用 awakeFromNib【英文标题】:awakeFromNib is not called for UITableViewCell object 【发布时间】:2013-05-29 10:45:47 【问题描述】:

我有一个继承自UITableViewCell 的类,它有一堆IBOutlets。我以前一直在以重用单元格并根据需要对其进行初始化的方式使用此对象。这个方法太慢了,所以我决定创建一个UITableViewCell对象的数组,然后根据需要添加到cellForRowAtIndexPath:方法中。

除了IBOutlet 对象外,一切都可以正常加载。 awakeFromNib 从未被调用,所以我认为这与我的问题有关。

为了澄清,当我在 cellForRowAtIndexPath 函数中初始化单元格时,它被正常调用了,只是当我试图在视图控制器 viewWillAppear 方法中预加载它们时,它会中断。

【问题讨论】:

无论你在做什么,我建议你停下来好好阅读UITableView 文档。 “创建 UITableViewCell 对象的数组,然后根据需要将它们添加到 cellForRowAtIndexPath: 函数中。”真的不是做事的方法。 你能解释一下为什么不吗?我的表中只有不到 10 个对象,因此预先加载它们应该不是什么大问题。 这不是UITableView 的工作方式。我觉得使用表格视图的常规方式太慢有点奇怪。我建议您使用分析器来查找真正占用时间的内容。 developer.apple.com/library/ios/#documentation/UserExperience/… 我很抱歉,但是链接到一个说明如何创建 UITableView 的页面并不完全有帮助。正如我在帖子中所说,我已经成功地创建了一种标准方式(如该链接中所述),并且工作正常。我现在要做的是预加载它们,为什么这是一件坏事?它目前唯一没有做的是链接到 nib 文件,其他一切正常,布局正确,滚动良好,我可以选择单个单元格。只是没有我在情节提要中定义的按钮或标签。 【参考方案1】:

我知道这是一个老问题。但看完对话后,我觉得我必须提供一些意见。这是您在此处处理的多层次问题。

首先,当您说“预加载”时,您的确切意思是什么。?你在viewWillAppear 中打电话给dequeueReusableCellWithIdentifier 吗?或者你打电话给init。无论哪种方式,这都不是可接受的做法。

请记住,UITableViewCells 是“可重用”的,这意味着 UITableView 实际上会在 UITableViewCells 不在屏幕时处理它们的卸载和加载,以优化性能(不是内存,信不信由你)以及其他一些事物。从本质上讲,保持表格视图高效是一个非常漂亮的“技巧”。所以如果你的UITableView太慢,那么你做错了,不是UITableView的实现

当您说您正在“预加载”它们时,会立即对您的使用提出一些危险信号。当您说“方法太慢”时,事实并非如此。 UITableViews 和 UICollectionViews 的委托/数据源方法按计算顺序发生。不要打架。

其次,关于awakeFromNib 没有被调用的问题。你没有提供足够的信息。你是怎么初始化的?如果您在情节提要/笔尖中创建它,则不应调用任何 init 方法。事实上,从 iOS6 开始,您可以保证来自dequeueReusableCellWithIdentifier 的非零单元格。

【讨论】:

【参考方案2】:

你有没有通过它的超类调用它,比如:

-(void)awakeFromNib

    [super awakeFromNib]; // Use this line 

希望对你有所帮助。

【讨论】:

我就是这样称呼它的。它在动态加载时有效,但在我尝试预加载并将其存储在数组中时不会被调用。

以上是关于UITableViewCell 对象不调用 awakeFromNib的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 不调用 prepareForSegue

当文本字段位于 uitableviewcell 中时,不调用 touchesBegan

Uitableviewcell调用uiviewcontroller函数不起作用swift ios

UITableViewCell 线程中的图像缓存

不再使用时从 UITableViewCell 中删除观察者

UITableViewCell 中可变数量的对象