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

Crashlytics报告未明确崩溃原因,下述scrollViewDidScroll方法是否会导致应用闪退?

在此输入图片描述

以下是相关功能的实现代码,我暂未发现其中存在任何会导致应用崩溃的问题:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y <= 0 {
        //reach top
        loggerDebug.info("Scroll view reach to top")
        availableRobomartListTV.isScrollEnabled = false
        // Add gesture to view if scroll reach to top
        view.addGestureRecognizer(gesture)
    }
}

潜在问题说明

上述代码虽不会直接触发崩溃,但存在两处明显的逻辑隐患:

  • 手势重复添加:scrollViewDidScroll会在滚动过程中高频触发,只要满足偏移量小于等于0的条件就会重复添加同一份手势。iOS 11以上系统会自动过滤重复添加的同个手势,但更低版本系统有概率触发野指针崩溃,且即使不崩溃也会导致手势触发回调被多次执行,出现逻辑异常。
  • 滚动能力未恢复:代码仅在滚动到顶部时禁用了列表的滚动能力,没有添加向下滚动时恢复isScrollEnabled = true的逻辑,会导致用户后续完全无法滚动列表。

修正后参考代码

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y <= 0 {
        // 滚动到顶部
        loggerDebug.info("Scroll view reach to top")
        guard availableRobomartListTV.isScrollEnabled else { return }
        availableRobomartListTV.isScrollEnabled = false
        // 先判断手势是否已经添加,避免重复添加
        if !(view.gestureRecognizers?.contains(gesture) ?? false) {
            view.addGestureRecognizer(gesture)
        }
    } else if scrollView.contentOffset.y > 0 {
        // 向下滚动时恢复滚动能力,移除对应手势
        guard !availableRobomartListTV.isScrollEnabled else { return }
        availableRobomartListTV.isScrollEnabled = true
        if view.gestureRecognizers?.contains(gesture) ?? false {
            view.removeGestureRecognizer(gesture)
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:04