【问题标题】:Custom XIB cell for UITableView stuttering / hitching on scroll用于 UITableView 的自定义 XIB 单元格在滚动时卡住/卡住
【发布时间】: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"];

标签: ios uitableview


【解决方案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"];
    }
    

    【讨论】:

    • 糟糕,对于不同的表对象引用感到抱歉。是的,它们确实是一样的,我只是在复制代码时搞砸了。至于笔尖的注册,我记得笔尖注册在某些情况下会丢失(我认为在表重新加载或其他情况下)。但无论如何,这真的不是问题,我没有看到任何过度注册的呼叫发生。此外,无论哪种方式,它都不会改变性能,这是我要解决的问题。
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2012-05-28
    相关资源
    最近更新 更多