You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS14下UITableView取消选中行功能正常但无动画问题求助

iOS14 UITableView 返回时取消选中无动画问题解决方案

我之前也碰到过iOS14上这个诡异的UITableView选中动画失效问题,结合你的场景,给你几个实测有效的解决思路:

方案一:利用导航控制器代理同步动画时机

这是最靠谱的方案,能完美复刻通讯录APP的平滑效果。因为iOS14对视图过渡的时机处理有变化,viewDidAppear的执行时机可能错过了动画同步的窗口,改用导航控制器的代理方法来触发取消选中:

  1. 让你的MainViewController遵守UINavigationControllerDelegate协议
  2. 在viewDidLoad里设置代理:
override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.delegate = self
    // 其他初始化代码...
}
  1. 实现代理方法,在即将回到当前页面时触发取消选中:
extension MainViewController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        // 确认是回到当前控制器时才执行
        if viewController === self, let selectedIndex = tableView.indexPathForSelectedRow {
            tableView.deselectRow(at: selectedIndex, animated: animated)
        }
    }
}

这个方法会把取消选中的动画和导航返回的动画完全同步,视觉上非常自然。

方案二:延迟执行取消选中操作

如果暂时不想改导航代理,也可以尝试在viewDidAppear里用主队列异步包裹代码,让动画加入到正确的渲染队列中:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    DispatchQueue.main.async {
        if let indexPath = self.tableView.indexPathForSelectedRow {
            self.tableView.deselectRow(at: indexPath, animated: true)
        }
    }
}

额外排查点

如果上面的方法都无效,建议检查这两个点:

  • 自定义的UITableViewCell是否重写了setSelected(_:animated:)方法?如果有,一定要先调用super.setSelected(selected, animated: animated),否则会覆盖系统的选中动画逻辑。
  • 确认你的tableView的allowsSelection属性是true(虽然你能选中,大概率没问题,但还是排查下更稳妥)

内容的提问来源于stack exchange,提问作者vomi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:17:35