1

我正在为我的表格的单元格视图注册一个 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"];
4

2 回答 2

1

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

于 2013-06-21T18:47:08.410 回答
0

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

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

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


尝试转移-registerNib:forCellReuseIdentifier:到另一种方法,例如-viewDidLoad或包装一些防止重复调用的保护措施。

@property (assign, nonatomic) BOOL nibRegistered;

…</p>

if (!self.nibRegistered) {
    self.nibRegistered = YES;
    UINib *nib = [UINib nibWithNibName:@"UIMyListTableCellView" bundle:nil];
    [table registerNib:nib forCellReuseIdentifier:@"MyTableCell"];
}
于 2013-06-19T00:15:43.930 回答