From e354c89b02546ba46c4743b97b1672c850b8ecfd Mon Sep 17 00:00:00 2001 From: Alec Mather Date: Wed, 13 Nov 2024 14:50:34 -0800 Subject: [PATCH 1/2] fix: Empty array & null checks in handleTabNavigatorChange method, fixes: Shared Element Transition (Solution provided) #6698 --- .../REASharedTransitionManager.m | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/react-native-reanimated/apple/reanimated/apple/LayoutReanimation/REASharedTransitionManager.m b/packages/react-native-reanimated/apple/reanimated/apple/LayoutReanimation/REASharedTransitionManager.m index 1bf674b1d6b4..042f6128637c 100644 --- a/packages/react-native-reanimated/apple/reanimated/apple/LayoutReanimation/REASharedTransitionManager.m +++ b/packages/react-native-reanimated/apple/reanimated/apple/LayoutReanimation/REASharedTransitionManager.m @@ -576,10 +576,26 @@ - (void)handleTabNavigatorChange:(REAUIView *)layoutedScreen return; } + // Add safety check for disappearing screens + if ([_disappearingScreens count] == 0) { + return; + } + REAUIView *navTabScreen = _disappearingScreens[0]; REAUIView *sourceScreen = _disappearingScreens[[_disappearingScreens count] - 1]; + + // Add null checks + if (!navTabScreen || !navTabScreen.reactSuperview) { + return; + } + REAUIView *targetTabScreen = [REAScreensHelper getActiveTabForTabNavigator:navTabScreen.reactSuperview]; REAUIView *targetScreen = [REAScreensHelper findTopScreenInChildren:targetTabScreen]; + + if (!targetScreen) { + return; + } + if (!layoutedScreen && _isTabNavigator) { // just wait for the next layout computation for your screen return; From 68260cfe1f18af2b7e2571bb9166cb4dd4791fc0 Mon Sep 17 00:00:00 2001 From: Alec Mather Date: Thu, 14 Nov 2024 11:16:30 -0800 Subject: [PATCH 2/2] Formatted for apple to fix linting --- .../apple/LayoutReanimation/REASharedTransitionManager.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-native-reanimated/apple/reanimated/apple/LayoutReanimation/REASharedTransitionManager.m b/packages/react-native-reanimated/apple/reanimated/apple/LayoutReanimation/REASharedTransitionManager.m index 042f6128637c..7e35f1bbdbd0 100644 --- a/packages/react-native-reanimated/apple/reanimated/apple/LayoutReanimation/REASharedTransitionManager.m +++ b/packages/react-native-reanimated/apple/reanimated/apple/LayoutReanimation/REASharedTransitionManager.m @@ -583,15 +583,15 @@ - (void)handleTabNavigatorChange:(REAUIView *)layoutedScreen REAUIView *navTabScreen = _disappearingScreens[0]; REAUIView *sourceScreen = _disappearingScreens[[_disappearingScreens count] - 1]; - + // Add null checks if (!navTabScreen || !navTabScreen.reactSuperview) { return; } - + REAUIView *targetTabScreen = [REAScreensHelper getActiveTabForTabNavigator:navTabScreen.reactSuperview]; REAUIView *targetScreen = [REAScreensHelper findTopScreenInChildren:targetTabScreen]; - + if (!targetScreen) { return; }