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
相关产品推荐
相关产品推荐

