diff --git a/e2e/Stack.test.js b/e2e/Stack.test.js index 09316bf18ee..94d036a197e 100644 --- a/e2e/Stack.test.js +++ b/e2e/Stack.test.js @@ -59,6 +59,12 @@ describe('Stack', () => { await expect(elementByLabel('didDisappear')).toBeVisible(); }); + it('Screen popped event', async () => { + await elementById(TestIDs.PUSH_LIFECYCLE_BTN).tap(); + await elementById(TestIDs.SCREEN_POPPED_BTN).tap(); + await expect(elementByLabel('Screen popped event')).toBeVisible(); + }); + it('unmount is called on pop', async () => { await elementById(TestIDs.PUSH_LIFECYCLE_BTN).tap(); await elementById(TestIDs.POP_BTN).tap(); diff --git a/lib/ios/StackControllerDelegate.m b/lib/ios/StackControllerDelegate.m index 9f1fd0c6a08..f49630b532a 100644 --- a/lib/ios/StackControllerDelegate.m +++ b/lib/ios/StackControllerDelegate.m @@ -14,7 +14,7 @@ - (instancetype)initWithEventEmitter:(RNNEventEmitter *)eventEmitter { } - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { - if ([navigationController.viewControllers indexOfObject:_presentedViewController] < 0) { + if (_presentedViewController && ![navigationController.viewControllers containsObject:_presentedViewController]) { [self sendScreenPoppedEvent:_presentedViewController]; } diff --git a/playground/src/screens/LifecycleScreen.js b/playground/src/screens/LifecycleScreen.js index 08631c5f5cc..9ed3b31a584 100644 --- a/playground/src/screens/LifecycleScreen.js +++ b/playground/src/screens/LifecycleScreen.js @@ -6,6 +6,7 @@ const Screens = require('./Screens'); const { PUSH_TO_TEST_DID_DISAPPEAR_BTN, DISMISS_MODAL_BTN, + SCREEN_POPPED_BTN, POP_BTN } = require('../testIDs'); @@ -25,6 +26,7 @@ class LifecycleScreen extends React.Component { constructor(props) { super(props); + this.showUnmountAndDisappearAlerts = true; Navigation.events().bindComponent(this); } @@ -33,12 +35,12 @@ class LifecycleScreen extends React.Component { } componentDidDisappear() { - alert('didDisappear'); // eslint-disable-line no-alert + this.showUnmountAndDisappearAlerts && alert('didDisappear'); // eslint-disable-line no-alert } componentWillUnmount() { setTimeout(() => { - alert('componentWillUnmount'); // eslint-disable-line no-alert + this.showUnmountAndDisappearAlerts && alert('componentWillUnmount'); // eslint-disable-line no-alert }, 100); } @@ -50,6 +52,7 @@ class LifecycleScreen extends React.Component { return (