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

UITableView调用scrollToRow后无法滚动的问题求助

解决UITableView预滚动后无法自由滚动的问题

这个坑我之前踩过!核心问题出在你把scrollToValue()放在了viewDidLayoutSubviews里——这个方法会被系统频繁触发:屏幕旋转、表格内容更新、甚至你手动滚动时的布局调整,都会让它执行。每次执行都会重新调用scrollToRow,这就导致你刚把表格滚到别的位置,它立刻又给你拽回指定的第30行,看起来就像“无法滚动”或者“自动回滚”。

修复方案:用标志位控制只执行一次初始滚动

我们只需要添加一个布尔变量,标记是否已经完成了初始的预滚动操作,避免重复触发:

  1. 首先在你的ViewController类里添加一个私有属性:
private var hasCompletedInitialScroll = false
  1. 修改viewDidLayoutSubviews的实现,确保只执行一次滚动:
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews() // 一定要记得调用super方法!
    // 只有还没执行过初始滚动时才触发
    guard !hasCompletedInitialScroll else { return }
    
    scrollToValue()
    hasCompletedInitialScroll = true
}
  1. 额外注意:如果你的表格数据是异步加载的(比如从网络请求数据),那最好在数据加载完成、调用tableView.reloadData()之后,再手动调用scrollToValue(),同时更新标志位。比如:
func loadData() {
    // 模拟异步数据加载
    DispatchQueue.global().async {
        // 获取数据...
        DispatchQueue.main.async {
            self.tableView.reloadData()
            self.scrollToValue()
            self.hasCompletedInitialScroll = true
        }
    }
}

小提醒

另外检查一下scrollPosition的值(你这里设的是30),确保它小于你的数据源中对应section的行数,不然scrollToRow会抛出异常,也可能导致奇怪的布局问题。

这样修改后,表格只会在首次布局完成时预滚动到指定位置,之后你就能自由滚动到任意位置,不会再出现自动回滚的情况了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:03:56