用于UITableView定制/挂接滚动的自定义XIB单元格

时间:2013-06-15 19:47:50

标签: ios uitableview

我正在为我的表的单元格视图注册一个XIB。没有什么花哨的,非常直接的小细胞视图与几个UIImageView和一些UILabel。事情按预期工作,但当我滚动时,我得到了很多口吃/搭便车。我做了一些分析,似乎在[UITableView _dequeueReusableTyper:withIdentifier:]中花了很多时间。我已经注释掉了我的cellForRowAtIndexPath方法中的所有代码,除了简单地出列和返回单元格,口吃仍然存在。所以罪魁祸首就是这个出列的调用栈。但我不知道如何优化这个以便顺利运行,而不是简化我的XIB中的单元格视图,这可能不是一个选项(或者是一个困难的选项)。我在这里错过任何我应该尝试的东西吗?

出列代码:

UIMyTableViewCell *cell = [table dequeueReusableCellWithIdentifier:@"MyTableCell"];
if (cell == nil)
{
    UINib *nib = [UINib nibWithNibName:@"UIMyListTableCellView" bundle:nil];
    [table registerNib:nib forCellReuseIdentifier:@"MyTableCell"];
}
cell = [table dequeueReusableCellWithIdentifier:@"MyTableCell"];

2 个答案:

答案 0 :(得分:1)

我能够摆脱口吃并获得高滚动帧率。对于遇到类似问题的其他人来说,问题在于将自定义XIB用于表格单元格。显然这个代码路径没有被优化,或者有些东西被窃听。我通过为自定义表格单元格实现自己的drawRect方法来替换它,现在事情正在全速发展。

答案 1 :(得分:0)

您应该只调用-registerNib:forCellReuseIdentifier:一次,每次[self.tableView dequeueReusableCellWithIdentifier:@"MyTableCell"]返回nil时都会调用它。

为什么从self.tableView开始,然后切换到table?这些是同一个对象吗?

如果它们不是同一个对象,则[self.tableView dequeueReusableCellWithIdentifier:@"MyTableCell"]将始终返回nil,您将始终致电-registerNib:forCellReuseIdentifier:


尝试将-registerNib:forCellReuseIdentifier:移动到-viewDidLoad之类的其他方法,或者针对重复的呼叫包含一些保护。

@property (assign, nonatomic) BOOL nibRegistered;

...

if (!self.nibRegistered) {
    self.nibRegistered = YES;
    UINib *nib = [UINib nibWithNibName:@"UIMyListTableCellView" bundle:nil];
    [table registerNib:nib forCellReuseIdentifier:@"MyTableCell"];
}