From bf38cf1be98f2d71f77cbc7913387cce4c1acab3 Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Wed, 17 Jul 2019 11:13:27 -0700 Subject: [PATCH] Fabric: Additional checks for _eventEmitter being null in ScrollView Summary: I finally convinced that we need to add this everywhere. iOS internals can call those methods at any moment (which is happening in coming diffs), so we cannot predict `_eventEmitter` being not null. Reviewed By: mdvacca Differential Revision: D16296052 fbshipit-source-id: 34447c2b5af4117d75930d68593d60bace119bbd --- .../ScrollView/RCTScrollViewComponentView.mm | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm index 7dab050fc1a..90502189558 100644 --- a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm @@ -169,16 +169,28 @@ using namespace facebook::react; - (void)scrollViewDidScroll:(UIScrollView *)scrollView { + if (!_eventEmitter) { + return; + } + std::static_pointer_cast(_eventEmitter)->onScroll([self _scrollViewMetrics]); } - (void)scrollViewDidZoom:(UIScrollView *)scrollView { + if (!_eventEmitter) { + return; + } + std::static_pointer_cast(_eventEmitter)->onScroll([self _scrollViewMetrics]); } - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { + if (!_eventEmitter) { + return; + } + std::static_pointer_cast(_eventEmitter)->onScrollBeginDrag([self _scrollViewMetrics]); } @@ -186,34 +198,58 @@ using namespace facebook::react; withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { + if (!_eventEmitter) { + return; + } + std::static_pointer_cast(_eventEmitter)->onScrollEndDrag([self _scrollViewMetrics]); } - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView { + if (!_eventEmitter) { + return; + } + std::static_pointer_cast(_eventEmitter) ->onMomentumScrollBegin([self _scrollViewMetrics]); } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { + if (!_eventEmitter) { + return; + } + std::static_pointer_cast(_eventEmitter)->onMomentumScrollEnd([self _scrollViewMetrics]); [self _updateStateWithContentOffset]; } - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { + if (!_eventEmitter) { + return; + } + std::static_pointer_cast(_eventEmitter)->onMomentumScrollEnd([self _scrollViewMetrics]); [self _updateStateWithContentOffset]; } - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view { + if (!_eventEmitter) { + return; + } + std::static_pointer_cast(_eventEmitter)->onScrollBeginDrag([self _scrollViewMetrics]); } - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale { + if (!_eventEmitter) { + return; + } + std::static_pointer_cast(_eventEmitter)->onScrollEndDrag([self _scrollViewMetrics]); [self _updateStateWithContentOffset]; }