我有一个继承自UITableViewCell
的类,它有一堆IBOutlets
。我以前一直以一种重用单元格并在需要时初始化它的方式使用这个对象。这个方法太慢了,所以我决定创建一个UITableViewCell
对象的数组,然后在cellForRowAtIndexPath:
方法中根据需要添加它们。
除了IBOutlet
对象外,所有东西都加载得很好。awakeFromNib
从未被调用,所以我认为这与我的问题有关。
澄清一下,当我在cellForRowAtIndexPath
函数中初始化单元格时,它被调用得很好,只是当我试图在视图控制器viewWillAppear
方法中预加载它们时,它中断了
我知道这是一个老问题。但看完对话后,我觉得我必须提出一些意见。你在这里处理的是一个多层次的问题。
首先,你说的"预加载"到底是什么意思?你是在呼叫viewWillAppear
中的dequeueReusableCellWithIdentifier
吗?或者你是在呼叫init
。不管怎样,这都是不可接受的做法。
记住,UITableViewCells是"可重用"的意思是UITableView,实际上,处理卸载和加载UITableViewCells
时,他们在屏幕外优化性能(不是内存,信不信由你)以及其他一些事情。从本质上讲,这是一个非常漂亮的"hack",以保持表视图的效率。所以如果你的UITableView
太慢,那么你做错了什么,而不是UITableView
的实现
当你说你正在"预加载"它们时,这会立即在你的使用中引发一些危险信号。当你说"这个方法太慢了",其实不是。UITableViews和UICollectionViews的委托/数据源方法按计算顺序发生。别反抗了。
其次,对于您的awakeFromNib
未被调用的问题。你没有提供足够的信息。你是如何初始化它的?如果你在storyboard/nib中创建它,你不应该调用任何init
方法。事实上,在iOS6中,您可以保证dequeueReusableCellWithIdentifier
的非nil单元格。
您是否通过它的超类调用过它:
-(void)awakeFromNib
{
[super awakeFromNib]; // Use this line
}
希望对你有帮助。