不为UITableViewCell对象调用awakeFromNib

时间:2013-05-29 10:45:47

标签: ios xcode uikit xcode-storyboard awakefromnib

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

IBOutlet个对象外,其他所有内容都可以正常加载。永远不会调用awakeFromNib所以我认为这与我的问题有关。

只是为了澄清当我在cellForRowAtIndexPath函数中初始化单元格时,它被称为正常,就在我尝试在它破坏的视图控制器viewWillAppear方法中预加载它时。 p>

2 个答案:

答案 0 :(得分:0)

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

首先,当你说" preload"你究竟是什么意思。您是否在dequeueReusableCellWithIdentifier中致电viewWillAppear了?或者你打电话给init。无论哪种方式,这都不是一种可接受的做法。

请记住,UITableViewCells是"可重复使用"这意味着UITableView实际上处理了UITableViewCells在屏幕外时的卸载和加载,以优化性能(不是内存,信不信由你)以及其他一些东西。从本质上讲,它是一个非常漂亮的" hack"保持表视图有效。因此,如果您的UITableView太慢,那么您做错了,而不是UITableView的实施

当你说你是"预加载"它们会在你的使用上引发一些直接的危险信号。当你说'#34;方法太慢"时,它不是。 UITableViews和UICollectionViews的委托/数据源方法以计算的顺序发生。不要打它。

其次,对于awakeFromNib没有被调用的问题。您没有提供足够的信息。你是如何初始化它的?如果您在storyboard / nib中创建了它,则不应该调用任何init方法。实际上,从iOS6开始,您可以保证dequeueReusableCellWithIdentifier的非零单元格。

答案 1 :(得分:-1)

你有没有通过它的超级类来调用它:

-(void)awakeFromNib
{
    [super awakeFromNib]; // Use this line 
}

希望它对你有所帮助。