@@ -7,7 +7,6 @@ import { IOSHelper } from '../core/view/view-helper';
77import { profile } from '../../profiling' ;
88import { CORE_ANIMATION_DEFAULTS , ios as iOSUtils , layout } from '../../utils' ;
99import { Trace } from '../../trace' ;
10- import type { PageTransition } from '../transition/page-transition' ;
1110import { SlideTransition } from '../transition/slide-transition' ;
1211import { FadeTransition } from '../transition/fade-transition' ;
1312import { SharedTransition } from '../transition/shared-transition' ;
@@ -22,11 +21,11 @@ const NAV_DEPTH = '_navDepth';
2221const TRANSITION = '_transition' ;
2322const NON_ANIMATED_TRANSITION = 'non-animated' ;
2423
25- let navDepth = - 1 ;
24+ let navDepth : number = - 1 ;
25+ let navControllerDelegate : UINavigationControllerDelegate = null ;
2626
2727export class Frame extends FrameBase {
2828 viewController : UINavigationControllerImpl ;
29- _animatedDelegate : UINavigationControllerDelegate ;
3029 public _ios : iOSFrame ;
3130 iosNavigationBarClass : typeof NSObject ;
3231 iosToolbarClass : typeof NSObject ;
@@ -38,6 +37,11 @@ export class Frame extends FrameBase {
3837 }
3938
4039 createNativeView ( ) {
40+ // Push frame back in frame stack since it was removed in disposeNativeView() method.
41+ if ( this . _currentEntry ) {
42+ this . _pushInFrameStack ( ) ;
43+ }
44+
4145 return this . viewController . view ;
4246 }
4347
@@ -61,7 +65,12 @@ export class Frame extends FrameBase {
6165
6266 this . _removeFromFrameStack ( ) ;
6367 this . viewController = null ;
64- this . _animatedDelegate = null ;
68+
69+ // This was the last frame so we can get rid of the controller delegate reference
70+ if ( this . _isFrameStackEmpty ( ) ) {
71+ navControllerDelegate = null ;
72+ }
73+
6574 if ( this . _ios ) {
6675 this . _ios . controller = null ;
6776 this . _ios = null ;
@@ -120,11 +129,12 @@ export class Frame extends FrameBase {
120129
121130 const nativeTransition = _getNativeTransition ( navigationTransition , true ) ;
122131 if ( ! nativeTransition && navigationTransition ) {
123- if ( ! this . _animatedDelegate ) {
124- this . _animatedDelegate = < UINavigationControllerDelegate > UINavigationControllerAnimatedDelegate . initWithOwner ( new WeakRef ( this ) ) ;
132+ if ( ! navControllerDelegate ) {
133+ navControllerDelegate = < UINavigationControllerDelegate > UINavigationControllerAnimatedDelegate . new ( ) ;
125134 }
126- this . _ios . controller . delegate = this . _animatedDelegate ;
127- viewController [ DELEGATE ] = this . _animatedDelegate ;
135+
136+ this . _ios . controller . delegate = navControllerDelegate ;
137+ viewController [ DELEGATE ] = navControllerDelegate ;
128138 if ( navigationTransition . instance ) {
129139 this . transitionId = navigationTransition . instance . id ;
130140 const transitionState = SharedTransition . getState ( this . transitionId ) ;
@@ -346,19 +356,6 @@ export class Frame extends FrameBase {
346356 public _setNativeViewFrame ( nativeView : UIView , frame : CGRect ) {
347357 //
348358 }
349-
350- public _onNavigatingTo ( backstackEntry : BackstackEntry , isBack : boolean ) {
351- // for now to not break iOS events chain (calling navigation events from controller delegates)
352- // we dont call super(which would also trigger events) but only notify the frame of the navigation
353- // though it means events are not triggered at the same time (lifecycle) on iOS / Android
354- this . notify ( {
355- eventName : Page . navigatingToEvent ,
356- object : this ,
357- isBack,
358- entry : backstackEntry ,
359- fromEntry : this . _currentEntry ,
360- } ) ;
361- }
362359}
363360
364361const transitionDelegates = new Array < TransitionDelegate > ( ) ;
@@ -413,14 +410,6 @@ class TransitionDelegate extends NSObject {
413410@NativeClass
414411class UINavigationControllerAnimatedDelegate extends NSObject implements UINavigationControllerDelegate {
415412 public static ObjCProtocols = [ UINavigationControllerDelegate ] ;
416- owner : WeakRef < Frame > ;
417- transition : PageTransition ;
418-
419- static initWithOwner ( owner : WeakRef < Frame > ) {
420- const delegate = < UINavigationControllerAnimatedDelegate > UINavigationControllerAnimatedDelegate . new ( ) ;
421- delegate . owner = owner ;
422- return delegate ;
423- }
424413
425414 navigationControllerAnimationControllerForOperationFromViewControllerToViewController ( navigationController : UINavigationController , operation : number , fromVC : UIViewController , toVC : UIViewController ) : UIViewControllerAnimatedTransitioning {
426415 let viewController : UIViewController ;
@@ -445,29 +434,30 @@ class UINavigationControllerAnimatedDelegate extends NSObject implements UINavig
445434 if ( Trace . isEnabled ( ) ) {
446435 Trace . write ( `UINavigationControllerImpl.navigationControllerAnimationControllerForOperationFromViewControllerToViewController(${ operation } , ${ fromVC } , ${ toVC } ), transition: ${ JSON . stringify ( navigationTransition ) } ` , Trace . categories . NativeLifecycle ) ;
447436 }
448- this . transition = navigationTransition . instance ;
449437
450- if ( ! this . transition ) {
438+ let transition = navigationTransition . instance ;
439+
440+ if ( ! transition ) {
451441 if ( navigationTransition . name ) {
452442 const curve = _getNativeCurve ( navigationTransition ) ;
453443 const name = navigationTransition . name . toLowerCase ( ) ;
454444 if ( name . indexOf ( 'slide' ) === 0 ) {
455- const direction = name . substring ( 'slide' . length ) || 'left' ; //Extract the direction from the string
456- this . transition = new SlideTransition ( direction , navigationTransition . duration , curve ) ;
445+ const direction = name . substring ( 'slide' . length ) || 'left' ; // Extract the direction from the string
446+ transition = new SlideTransition ( direction , navigationTransition . duration , curve ) ;
457447 } else if ( name === 'fade' ) {
458- this . transition = new FadeTransition ( navigationTransition . duration , curve ) ;
448+ transition = new FadeTransition ( navigationTransition . duration , curve ) ;
459449 }
460450 }
461451 }
462452
463- if ( this . transition ?. iosNavigatedController ) {
464- return this . transition . iosNavigatedController ( navigationController , operation , fromVC , toVC ) ;
453+ if ( transition ?. iosNavigatedController ) {
454+ return transition . iosNavigatedController ( navigationController , operation , fromVC , toVC ) ;
465455 }
466456 return null ;
467457 }
468458
469- navigationControllerInteractionControllerForAnimationController ( navigationController : UINavigationController , animationController : UIViewControllerAnimatedTransitioning ) : UIViewControllerInteractiveTransitioning {
470- const owner = this . owner ?. deref ( ) ;
459+ navigationControllerInteractionControllerForAnimationController ( navigationController : UINavigationControllerImpl , animationController : UIViewControllerAnimatedTransitioning ) : UIViewControllerInteractiveTransitioning {
460+ const owner = navigationController . owner ;
471461 if ( owner ) {
472462 const state = SharedTransition . getState ( owner . transitionId ) ;
473463 if ( state ?. instance ?. iosInteractionDismiss ) {
0 commit comments