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

带原型单元格的UITableView真机无法手动滚动求助

解决UITableView真机无法手动滚动的问题

根据你描述的场景,数据填充正常但没法手动滚动,结合你的代码逻辑来看,最可能的原因是定时器每隔0.3秒就强制调用scrollToRow滚到底部,完全抢占了UITableView的滚动控制权——你刚手动拖动一点,定时器触发就把表格拉回底部,看起来就像不能手动滚动。

下面是针对性的解决建议:

1. 监听滚动状态,动态暂停/恢复定时器

利用UITableView继承自UIScrollView的特性,通过代理方法监听用户的手动滚动操作,在用户开始拖拽时暂停定时器,滚动结束后再恢复:

确保你的视图控制器已经关联了UITableViewDelegate(你已经做了这一步),然后添加以下代码:

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    // 用户开始手动拖拽,暂停定时器
    timer?.invalidate()
    timer = nil
}

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if !decelerate {
        // 滚动直接结束,恢复定时器
        restartTimer()
    }
}

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    // 滚动减速完成,恢复定时器
    restartTimer()
}

private func restartTimer() {
    // 只有还有未展示的数据时才重启定时器
    guard arrayIndex < answers.count else { return }
    timer = Timer.scheduledTimer(timeInterval: 0.3, target: self, selector: #selector(nextAnswer), userInfo: nil, repeats: true)
}

2. 检查基础设置是否遗漏

  • 确认lvMain.isScrollEnabled为true:虽然你开启了用户交互,但滚动开关是单独的属性,可能在Storyboard中被意外关闭,或者代码中被修改。可以在viewDidLoad里显式设置:
    lvMain.isScrollEnabled = true
    
  • 移除不必要的代码:nextAnswer中的lvMain.layoutIfNeeded()如果没有特殊布局需求,可以去掉,避免干扰滚动逻辑。

3. 排查手势冲突

如果上面的方法无效,检查是否有父视图的手势识别器拦截了UITableView的触摸事件:

  • 查看父视图是否添加了UIPanGestureRecognizer等手势,尝试设置手势的cancelsTouchesInView = false,避免阻断表格的滚动手势。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:18:36