UITableView调用scrollToRow后无法滚动的问题求助
解决UITableView预滚动后无法自由滚动的问题
这个坑我之前踩过!核心问题出在你把scrollToValue()放在了viewDidLayoutSubviews里——这个方法会被系统频繁触发:屏幕旋转、表格内容更新、甚至你手动滚动时的布局调整,都会让它执行。每次执行都会重新调用scrollToRow,这就导致你刚把表格滚到别的位置,它立刻又给你拽回指定的第30行,看起来就像“无法滚动”或者“自动回滚”。
修复方案:用标志位控制只执行一次初始滚动
我们只需要添加一个布尔变量,标记是否已经完成了初始的预滚动操作,避免重复触发:
- 首先在你的ViewController类里添加一个私有属性:
private var hasCompletedInitialScroll = false
- 修改
viewDidLayoutSubviews的实现,确保只执行一次滚动:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // 一定要记得调用super方法! // 只有还没执行过初始滚动时才触发 guard !hasCompletedInitialScroll else { return } scrollToValue() hasCompletedInitialScroll = true }
- 额外注意:如果你的表格数据是异步加载的(比如从网络请求数据),那最好在数据加载完成、调用
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
相关产品推荐
相关产品推荐

