What happened?
On iOS, Navigation.showOverlay() creates a new RNNOverlayWindow with initWithFrame: and never assigns a UIWindowScene.
With a scene-based app lifecycle, that window is not added to the scene, so the overlay never appears. JS still mounts and runs (the overlay VC is created and rendered), which makes this look like a hang: native/RNN splash dismisses, overlay logic is running, but the screen stays on RNNSplashScreenViewController / the current root.
Navigation.setRoot() is not affected, because it attaches the layout to the existing _mainWindow that the host already bound to the scene.
This is easy to miss on older iOS if the app still used the AppDelegate window path. It becomes a hard break once the app adopts UIWindowScene (mandatory on iOS 26+).
What was the expected behaviour?
showOverlay shows the overlay above the current root on the same UIWindowScene.
Was it tested on latest react-native-navigation?
Help us reproduce this issue!
- Use UIScene lifecycle (
UIApplicationSceneManifest + UIWindowSceneDelegate).
- Create the window with
initWithWindowScene: and pass it to RNN (delegate.window set before bootstrap).
- On
Navigation.events().registerAppLaunchedListener, do not setRoot. Call:
Navigation.showOverlay({
component: {
name: 'example.OverlayScreen',
},
});
- OverlayScreen mounts (
componentDidMount / useEffect runs) but nothing is visible. The scene window is still RNNSplashScreenViewController.
Control: the same screen shown via setRoot appears correctly:
Navigation.setRoot({
root: {
stack: {
children: [{ component: { name: 'example.OverlayScreen' } }],
},
},
});
In what environment did this happen?
- react-native-navigation:
8.8.9
- react-native:
0.87 (New Architecture / Fabric, bridgeless)
- iOS: 26 / 27 (also repros conceptually on iOS 13+ with
UIScene)
- Host:
RNNAppDelegate + custom UIWindowSceneDelegate
- Platform: iOS only
What happened?
On iOS,
Navigation.showOverlay()creates a newRNNOverlayWindowwithinitWithFrame:and never assigns aUIWindowScene.With a scene-based app lifecycle, that window is not added to the scene, so the overlay never appears. JS still mounts and runs (the overlay VC is created and rendered), which makes this look like a hang: native/RNN splash dismisses, overlay logic is running, but the screen stays on
RNNSplashScreenViewController/ the current root.Navigation.setRoot()is not affected, because it attaches the layout to the existing_mainWindowthat the host already bound to the scene.This is easy to miss on older iOS if the app still used the AppDelegate window path. It becomes a hard break once the app adopts
UIWindowScene(mandatory on iOS 26+).What was the expected behaviour?
showOverlayshows the overlay above the current root on the sameUIWindowScene.Was it tested on latest react-native-navigation?
Help us reproduce this issue!
UIApplicationSceneManifest+UIWindowSceneDelegate).initWithWindowScene:and pass it to RNN (delegate.windowset before bootstrap).Navigation.events().registerAppLaunchedListener, do notsetRoot. Call:componentDidMount/useEffectruns) but nothing is visible. The scene window is stillRNNSplashScreenViewController.Control: the same screen shown via
setRootappears correctly:In what environment did this happen?
8.8.90.87(New Architecture / Fabric, bridgeless)UIScene)RNNAppDelegate+ customUIWindowSceneDelegate