【问题标题】:SWIFT deselectRowAtIndex is really slow when updating table更新表时,SWIFT deselectRowAtIndex 真的很慢
【发布时间】:2025-12-12 12:30:18
【问题描述】:

我不确定这是否与 SWIFT 或某些错误有关,但我曾经能够在目标 c 中调用它来放大和缩小 tableview 单元格:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if([indexPath isEqual:[tableView indexPathForSelectedRow]])  {
    return 500.0;
}

return 81.0; 
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

if (isShowingDetails == YES) {

isShowDetails = NO;
[tableView deselectRowAtIndexPath:indexPath animated:YES];
[tableView beginUpdates];
[tableView endUpdates];

 }else {

    isShowingDetails = YES;
    [tableView beginUpdates];
    [tableView endUpdates];


}
}

但是现在如果我尝试使用这个 SWIFT 版本,当取消选择该行时,它有几秒钟的非常糟糕的延迟.. 这是 SWIFT 版本:

  override func tableView(tableView: UITableView!,
        heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {

            if(indexPath.isEqual(tableView.indexPathForSelectedRow()))  {
                return 500.0;


            }
            return 81.0;

    }

override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {

        if(isExpanded == true)
        {

             isExpanded = false
            self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
            self.tableView.beginUpdates()
            self.tableView.endUpdates()


        } else {
           isExpanded = true
            self.tableView.beginUpdates()
            self.tableView.endUpdates()




        }
    }

有什么想法吗?正如我所说,我不确定它是否是我写的方式,但我不明白为什么我在目标 C 中从来没有遇到过任何问题。 第一次选择它时它在 SWIFT 中运行良好,只是更新延迟真的很痛苦..

【问题讨论】:

  • 仅供参考 - 这是 Swift,而不是 SWIFT。
  • == YES== true 是多余的、不必要的、烦人的和分散注意力的。过去几天我经常看到这种情况。谁教这个?
  • 你为什么在你的didSelect方法中调用begin/endUpdates?尤其是当您甚至不执行更新时,这似乎很浪费。

标签: ios uitableview swift


【解决方案1】:

iOS 8 中的表格视图现在可以让它们的单元格声明它们自己的高度,而不需要在委托方法中实现它们。如果可以的话,您可能想考虑这样做,因为这将是一种更清洁的方式来完成您在此处尝试执行的操作。

否则,您是否对 iOS 8 中的 Objective-C 代码进行了基准测试,以确保性能影响不在 UIKit 框架本身? Swift 仍在调用底层框架,这就是大部分工作正在进行的地方。如果在 iOS 8 上 Objective-C 和 Swift 实现看起来同样慢,你就知道这是 UITableView 方法本身的问题,你可以针对它们提交错误。如果它只是 Swift,你知道这是 Swift / UIKit/Objective-C 桥接的错误,并且可以针对它提出错误。

【讨论】:

  • 我刚刚意识到我的整个 tableview 很慢,包括滚动.. 所以这可能是一个 SWIFT 问题
  • 请检查您现有的 Objective-C 代码是否同样慢,如上所述。
  • 那么一定要提交一个错误,如果可以的话,我建议附上一个示例项目! :)
【解决方案2】:

我也有同样的问题。更新到 ios 8 后。我的 tableview 变慢了。我有一个基于标签栏的应用程序。应用程序有 2 个选项卡都包含表格视图。第一个选项卡上的 Tableview 控制器有大约 350 个单元格,第二个包含大约 40 个单元格。所以当我从 tab2 切换到 tab1 时,我得到了 2 秒的巨大延迟。但是当我从 tab1 切换到 tab2 时,它会更快,因为 tab2 上的 tableview 的单元格相对较少。 但我的问题是,当我在任何 ios6 或 ios7 设备上运行相同的代码相同的应用程序时。它更快,即使没有可跟踪的延迟。而且在 ios 8 中 didselect 也很慢,tableview 使整个 viewcontroller 超级慢。我到处点击,我得到延迟。应用在 ios7 上运行非常流畅。

【讨论】: