用于 UITableView 的自定义 XIB 单元格在滚动时卡住/卡住
Posted
技术标签:
【中文标题】用于 UITableView 的自定义 XIB 单元格在滚动时卡住/卡住【英文标题】:Custom XIB cell for UITableView stuttering / hitching on scroll 【发布时间】:2013-06-15 19:47:49 【问题描述】:我正在为表格的单元格视图注册一个 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"];
【问题讨论】:
您在单元格中放入什么样的图像 - 什么尺寸/分辨率? 你能发布一些代码吗?出队的发生方式可能存在错误。 小图像。一张图片是 100x100 像素,还有两张较小的 30x30 像素。 我的出队代码:UIMyTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"MyTableCell"]; if (cell == nil) UINib *nib = [UINib nibWithNibName:@"UIMyListTableCellView" bundle:nil]; [table registerNib:nib forCellReuseIdentifier:@"MyTableCell"]; cell = [table dequeueReusableCellWithIdentifier:@"MyTableCell"];
【参考方案1】:
我能够摆脱口吃并获得高滚动帧率。对于遇到类似问题的其他人,问题在于将自定义 XIB 用于表格单元格。显然这个代码路径没有优化,或者有什么问题。我通过为自定义表格单元格实现自己的 drawRect 方法来替换它,现在事情正在全速发展。
【讨论】:
【参考方案2】:你应该只调用一次-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"];
【讨论】:
糟糕,对于不同的表对象引用感到抱歉。是的,它们确实是一样的,我只是在复制代码时搞砸了。至于笔尖的注册,我记得笔尖注册在某些情况下会丢失(我认为在表重新加载或其他情况下)。但无论如何,这真的不是问题,我没有看到任何过度注册的呼叫发生。此外,无论哪种方式,它都不会改变性能,这是我要解决的问题。以上是关于用于 UITableView 的自定义 XIB 单元格在滚动时卡住/卡住的主要内容,如果未能解决你的问题,请参考以下文章
来自 .xib 文件的自定义 UITableViewCell
单击tableView后隐藏xib的自定义UITableViewCell
如何将 SwipeCellKit 的自定义滑动功能用于从 .xib 文件创建的自定义单元格?