From bcdb126c3975c79f3e378ae6486eb20cbe2f3030 Mon Sep 17 00:00:00 2001 From: vijay Date: Thu, 29 Oct 2020 17:57:14 -0700 Subject: [PATCH 1/6] fix(ios): set parent for UITabController and UINavigationController --- iphone/Classes/TiMediaVideoPlayer.m | 20 ++++++++++++++++++++ iphone/Classes/TiUINavigationWindowProxy.m | 16 +++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/iphone/Classes/TiMediaVideoPlayer.m b/iphone/Classes/TiMediaVideoPlayer.m index 7c9307a4772..4c68bcc9d2d 100644 --- a/iphone/Classes/TiMediaVideoPlayer.m +++ b/iphone/Classes/TiMediaVideoPlayer.m @@ -10,6 +10,9 @@ #import #import #import +#import +#import +#import @implementation TiMediaVideoPlayer @@ -61,7 +64,9 @@ - (void)setMovie:(AVPlayerViewController *)controller_ // don't add the movie more than once if the same return; } + [controller willMoveToParentViewController:nil]; [[controller view] removeFromSuperview]; + [controller didMoveToParentViewController:nil]; [spinner removeFromSuperview]; RELEASE_TO_NIL(spinner); RELEASE_TO_NIL(controller); @@ -71,9 +76,24 @@ - (void)setMovie:(AVPlayerViewController *)controller_ } controller = [controller_ retain]; + // Set parent for AVPlayerViewController controller + if (!parentController) { + id proxy = [(TiViewProxy *)self.proxy parent]; + while ([proxy isKindOfClass:[TiViewProxy class]] && ![proxy isKindOfClass:[TiWindowProxy class]]) { + proxy = [proxy parent]; + } + if ([proxy isKindOfClass:[TiWindowProxy class]]) { + parentController = [[proxy windowHoldingController] retain]; + } else { + parentController = [[[TiApp app] controller] retain]; + } + } + + [parentController addChildViewController:controller]; [TiUtils setView:[controller view] positionRect:self.bounds]; [self addSubview:[controller view]]; [self sendSubviewToBack:[controller view]]; + [controller didMoveToParentViewController:parentController]; TiColor *bgcolor = [TiUtils colorValue:[self.proxy valueForKey:@"backgroundColor"]]; UIActivityIndicatorViewStyle style = UIActivityIndicatorViewStyleGray; diff --git a/iphone/Classes/TiUINavigationWindowProxy.m b/iphone/Classes/TiUINavigationWindowProxy.m index 3f2c8b8f2b1..762f27007ea 100644 --- a/iphone/Classes/TiUINavigationWindowProxy.m +++ b/iphone/Classes/TiUINavigationWindowProxy.m @@ -351,7 +351,10 @@ - (void)cleanNavStack [win setParentOrientationController:nil]; [win close:nil]; } + // Remove navigation controller from parent controller + [navController willMoveToParentViewController:nil]; [navController.view removeFromSuperview]; + [navController removeFromParentViewController]; RELEASE_TO_NIL(navController); RELEASE_TO_NIL(rootWindow); RELEASE_TO_NIL(current); @@ -496,7 +499,18 @@ - (void)windowWillOpen UIView *nview = [[self controller] view]; [nview setFrame:[[self view] bounds]]; [[self view] addSubview:nview]; - return [super windowWillOpen]; + [super windowWillOpen]; +} + +- (void)windowDidOpen +{ + // Set parent for navigation controller + UINavigationController *navControlleer = [self controller]; + + UIViewController *parentController = [self windowHoldingController]; + [parentController addChildViewController:navControlleer]; + [navControlleer didMoveToParentViewController:parentController]; + [super windowDidOpen]; } - (void)windowDidClose From ae878b56c9db4f9fee744fb290d697bbbd5b74a2 Mon Sep 17 00:00:00 2001 From: vijay Date: Thu, 29 Oct 2020 18:01:27 -0700 Subject: [PATCH 2/6] fix(ios): set parent for UITabController and AVPlayerViewController --- iphone/Classes/TiMediaVideoPlayer.h | 1 + iphone/Classes/TiMediaVideoPlayer.m | 7 +++---- iphone/Classes/TiUITabGroupProxy.m | 20 ++++++++++++++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/iphone/Classes/TiMediaVideoPlayer.h b/iphone/Classes/TiMediaVideoPlayer.h index 8dbac47f81f..68db0c0d354 100644 --- a/iphone/Classes/TiMediaVideoPlayer.h +++ b/iphone/Classes/TiMediaVideoPlayer.h @@ -14,6 +14,7 @@ @private AVPlayerViewController *controller; UIActivityIndicatorView *spinner; + UIViewController *parentController; BOOL loaded; } diff --git a/iphone/Classes/TiMediaVideoPlayer.m b/iphone/Classes/TiMediaVideoPlayer.m index 4c68bcc9d2d..cb725656824 100644 --- a/iphone/Classes/TiMediaVideoPlayer.m +++ b/iphone/Classes/TiMediaVideoPlayer.m @@ -7,12 +7,11 @@ #ifdef USE_TI_MEDIAVIDEOPLAYER #import "TiMediaVideoPlayer.h" +#import #import #import -#import #import -#import -#import +#import @implementation TiMediaVideoPlayer @@ -88,7 +87,7 @@ - (void)setMovie:(AVPlayerViewController *)controller_ parentController = [[[TiApp app] controller] retain]; } } - + [parentController addChildViewController:controller]; [TiUtils setView:[controller view] positionRect:self.bounds]; [self addSubview:[controller view]]; diff --git a/iphone/Classes/TiUITabGroupProxy.m b/iphone/Classes/TiUITabGroupProxy.m index 67e8d52f434..2fe33d27a8f 100644 --- a/iphone/Classes/TiUITabGroupProxy.m +++ b/iphone/Classes/TiUITabGroupProxy.m @@ -147,16 +147,32 @@ - (void)windowWillOpen { TiUITabGroup *tg = (TiUITabGroup *)self.view; [tg open:nil]; - return [super windowWillOpen]; + [super windowWillOpen]; +} + +- (void)windowDidOpen +{ + // Set parent view controller for UITabBarController + UITabBarController *tabController = [(TiUITabGroup *)[self view] tabController]; + + UIViewController *parentController = [self windowHoldingController]; + [parentController addChildViewController:tabController]; + [tabController didMoveToParentViewController:parentController]; + [super windowDidOpen]; } - (void)windowWillClose { TiUITabGroup *tabGroup = (TiUITabGroup *)self.view; if (tabGroup != nil) { + // Remove UITabBarController from parent view controller + UITabBarController *tabController = [(TiUITabGroup *)[self view] tabController]; + [tabController willMoveToParentViewController:nil]; + [tabController.view removeFromSuperview]; + [tabController removeFromParentViewController]; [tabGroup close:nil]; } - return [super windowWillClose]; + [super windowWillClose]; } - (void)didReceiveMemoryWarning:(NSNotification *)notification From bc54a7da68d5f5c5ced55e272d903a7585a67236 Mon Sep 17 00:00:00 2001 From: vijay Date: Fri, 30 Oct 2020 13:39:41 -0700 Subject: [PATCH 3/6] fix(ios): fixed memory leak in listview and tableview --- iphone/Classes/TiUIListView.m | 1 + iphone/Classes/TiUINavigationWindowProxy.m | 9 +++++---- iphone/Classes/TiUITabGroupProxy.m | 12 +++++++----- iphone/Classes/TiUITableView.m | 1 + 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/iphone/Classes/TiUIListView.m b/iphone/Classes/TiUIListView.m index 549dc1eb814..0e8c3d59d16 100644 --- a/iphone/Classes/TiUIListView.m +++ b/iphone/Classes/TiUIListView.m @@ -2414,6 +2414,7 @@ - (void)createDimmingView dimmingView.alpha = .2; UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissSearchController)]; [dimmingView addGestureRecognizer:tapGesture]; + [tapGesture release]; } } diff --git a/iphone/Classes/TiUINavigationWindowProxy.m b/iphone/Classes/TiUINavigationWindowProxy.m index 762f27007ea..26a7d71899f 100644 --- a/iphone/Classes/TiUINavigationWindowProxy.m +++ b/iphone/Classes/TiUINavigationWindowProxy.m @@ -505,11 +505,12 @@ - (void)windowWillOpen - (void)windowDidOpen { // Set parent for navigation controller - UINavigationController *navControlleer = [self controller]; + if (navController) { + UIViewController *parentController = [self windowHoldingController]; + [parentController addChildViewController:navController]; + [navController didMoveToParentViewController:parentController]; + } - UIViewController *parentController = [self windowHoldingController]; - [parentController addChildViewController:navControlleer]; - [navControlleer didMoveToParentViewController:parentController]; [super windowDidOpen]; } diff --git a/iphone/Classes/TiUITabGroupProxy.m b/iphone/Classes/TiUITabGroupProxy.m index 2fe33d27a8f..00c62792e5c 100644 --- a/iphone/Classes/TiUITabGroupProxy.m +++ b/iphone/Classes/TiUITabGroupProxy.m @@ -153,11 +153,13 @@ - (void)windowWillOpen - (void)windowDidOpen { // Set parent view controller for UITabBarController - UITabBarController *tabController = [(TiUITabGroup *)[self view] tabController]; - - UIViewController *parentController = [self windowHoldingController]; - [parentController addChildViewController:tabController]; - [tabController didMoveToParentViewController:parentController]; + TiUITabGroup *tabGroup = (TiUITabGroup *)self.view; + if (tabGroup) { + UITabBarController *tabController = [tabGroup tabController]; + UIViewController *parentController = [self windowHoldingController]; + [parentController addChildViewController:tabController]; + [tabController didMoveToParentViewController:parentController]; + } [super windowDidOpen]; } diff --git a/iphone/Classes/TiUITableView.m b/iphone/Classes/TiUITableView.m index 0dbfb8d1e9f..a1665c57473 100644 --- a/iphone/Classes/TiUITableView.m +++ b/iphone/Classes/TiUITableView.m @@ -2422,6 +2422,7 @@ - (void)createDimmingView dimmingView.alpha = .2; UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissSearchController)]; [dimmingView addGestureRecognizer:tapGesture]; + [tapGesture release]; } } From c34b4bfdaa83f1f6906539377edffb420d7ad8ec Mon Sep 17 00:00:00 2001 From: vijay Date: Fri, 30 Oct 2020 16:32:22 -0700 Subject: [PATCH 4/6] fix(ios): remove AVPlayerViewController from parent --- iphone/Classes/TiMediaVideoPlayer.m | 6 +++++- iphone/Classes/TiMediaVideoPlayerProxy.m | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/iphone/Classes/TiMediaVideoPlayer.m b/iphone/Classes/TiMediaVideoPlayer.m index cb725656824..1afacf3424d 100644 --- a/iphone/Classes/TiMediaVideoPlayer.m +++ b/iphone/Classes/TiMediaVideoPlayer.m @@ -65,7 +65,7 @@ - (void)setMovie:(AVPlayerViewController *)controller_ } [controller willMoveToParentViewController:nil]; [[controller view] removeFromSuperview]; - [controller didMoveToParentViewController:nil]; + [controller removeFromParentViewController]; [spinner removeFromSuperview]; RELEASE_TO_NIL(spinner); RELEASE_TO_NIL(controller); @@ -137,7 +137,11 @@ - (BOOL)touchedContentViewWithEvent:(UIEvent *)event - (void)dealloc { + [controller willMoveToParentViewController:nil]; [[controller view] removeFromSuperview]; + [controller removeFromParentViewController]; + + RELEASE_TO_NIL(parentController); RELEASE_TO_NIL(controller); RELEASE_TO_NIL(spinner); [super dealloc]; diff --git a/iphone/Classes/TiMediaVideoPlayerProxy.m b/iphone/Classes/TiMediaVideoPlayerProxy.m index fa07edca45d..9a69b3e8896 100644 --- a/iphone/Classes/TiMediaVideoPlayerProxy.m +++ b/iphone/Classes/TiMediaVideoPlayerProxy.m @@ -181,7 +181,9 @@ - (void)windowWillClose { [super windowWillClose]; [[movie player] pause]; - [(TiMediaVideoPlayer *)self.view setMovie:nil]; + if ([self viewAttached]) { + [(TiMediaVideoPlayer *)self.view setMovie:nil]; + } } #pragma mark Public APIs From 1622a0b5866a8d40a54fdcc8af2b6b9f0b073ec4 Mon Sep 17 00:00:00 2001 From: vijay Date: Fri, 30 Oct 2020 16:40:34 -0700 Subject: [PATCH 5/6] chore(ios): remove commented code --- .../TitaniumKit/Sources/API/TiWindowProxy.m | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/iphone/TitaniumKit/TitaniumKit/Sources/API/TiWindowProxy.m b/iphone/TitaniumKit/TitaniumKit/Sources/API/TiWindowProxy.m index c2f4e4b5806..c1767b42a42 100644 --- a/iphone/TitaniumKit/TitaniumKit/Sources/API/TiWindowProxy.m +++ b/iphone/TitaniumKit/TitaniumKit/Sources/API/TiWindowProxy.m @@ -159,23 +159,6 @@ - (void)attachViewToTopContainerController TiUIView *theView = [self view]; [rootView addSubview:theView]; [rootView bringSubviewToFront:theView]; - - // TODO: Revisit - /* - UIViewController* topContainerController = [[[TiApp app] controller] topContainerController]; - UIView *rootView = [topContainerController hostingView]; - - UIViewController* thisViewController = [self hostingController]; - UIView* theView = [thisViewController view]; - [theView setFrame:[rootView bounds]]; - - [thisViewController willMoveToParentViewController:topContainerController]; - [topContainerController addChildViewController:thisViewController]; - - [rootView addSubview:theView]; - [rootView bringSubviewToFront:theView]; - [thisViewController didMoveToParentViewController:topContainerController]; - */ } - (BOOL)argOrWindowPropertyExists:(NSString *)key args:(id)args From 1feaa89583afeec87b79b2a5f00fede004820daa Mon Sep 17 00:00:00 2001 From: vijay Date: Thu, 5 Nov 2020 12:15:56 -0800 Subject: [PATCH 6/6] fix(ios): addressed review comments --- iphone/Classes/TiMediaVideoPlayer.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iphone/Classes/TiMediaVideoPlayer.m b/iphone/Classes/TiMediaVideoPlayer.m index 1afacf3424d..95fcb7be5c3 100644 --- a/iphone/Classes/TiMediaVideoPlayer.m +++ b/iphone/Classes/TiMediaVideoPlayer.m @@ -78,11 +78,11 @@ - (void)setMovie:(AVPlayerViewController *)controller_ // Set parent for AVPlayerViewController controller if (!parentController) { id proxy = [(TiViewProxy *)self.proxy parent]; - while ([proxy isKindOfClass:[TiViewProxy class]] && ![proxy isKindOfClass:[TiWindowProxy class]]) { + while (proxy != nil && ![proxy isKindOfClass:[TiWindowProxy class]]) { proxy = [proxy parent]; } - if ([proxy isKindOfClass:[TiWindowProxy class]]) { - parentController = [[proxy windowHoldingController] retain]; + if (proxy != nil) { + parentController = [[(TiWindowProxy *)proxy windowHoldingController] retain]; } else { parentController = [[[TiApp app] controller] retain]; }