Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(iOS): set parent view controller for detached view controllers #12233

Merged
merged 10 commits into from Jan 15, 2021
1 change: 1 addition & 0 deletions iphone/Classes/TiMediaVideoPlayer.h
Expand Up @@ -14,6 +14,7 @@
@private
AVPlayerViewController *controller;
UIActivityIndicatorView *spinner;
UIViewController *parentController;

BOOL loaded;
}
Expand Down
23 changes: 23 additions & 0 deletions iphone/Classes/TiMediaVideoPlayer.m
Expand Up @@ -7,8 +7,10 @@
#ifdef USE_TI_MEDIAVIDEOPLAYER

#import "TiMediaVideoPlayer.h"
#import <TitaniumKit/TiApp.h>
#import <TitaniumKit/TiUtils.h>
#import <TitaniumKit/TiViewProxy.h>
#import <TitaniumKit/TiWindowProxy.h>
#import <TitaniumKit/Webcolor.h>

@implementation TiMediaVideoPlayer
Expand Down Expand Up @@ -61,7 +63,9 @@ - (void)setMovie:(AVPlayerViewController *)controller_
// don't add the movie more than once if the same
return;
}
[controller willMoveToParentViewController:nil];
[[controller view] removeFromSuperview];
[controller removeFromParentViewController];
[spinner removeFromSuperview];
RELEASE_TO_NIL(spinner);
RELEASE_TO_NIL(controller);
Expand All @@ -71,9 +75,24 @@ - (void)setMovie:(AVPlayerViewController *)controller_
}
controller = [controller_ retain];

// Set parent for AVPlayerViewController controller
if (!parentController) {
id proxy = [(TiViewProxy *)self.proxy parent];
while (proxy != nil && ![proxy isKindOfClass:[TiWindowProxy class]]) {
proxy = [proxy parent];
}
if (proxy != nil) {
parentController = [[(TiWindowProxy *)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;
Expand Down Expand Up @@ -118,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];
Expand Down
4 changes: 3 additions & 1 deletion iphone/Classes/TiMediaVideoPlayerProxy.m
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions iphone/Classes/TiUIListView.m
Expand Up @@ -2417,6 +2417,7 @@ - (void)createDimmingView
dimmingView.alpha = .2;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissSearchController)];
[dimmingView addGestureRecognizer:tapGesture];
[tapGesture release];
}
}

Expand Down
17 changes: 16 additions & 1 deletion iphone/Classes/TiUINavigationWindowProxy.m
Expand Up @@ -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);
Expand Down Expand Up @@ -496,7 +499,19 @@ - (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
if (navController) {
UIViewController *parentController = [self windowHoldingController];
[parentController addChildViewController:navController];
[navController didMoveToParentViewController:parentController];
}

[super windowDidOpen];
}

- (void)windowDidClose
Expand Down
22 changes: 20 additions & 2 deletions iphone/Classes/TiUITabGroupProxy.m
Expand Up @@ -147,16 +147,34 @@ - (void)windowWillOpen
{
TiUITabGroup *tg = (TiUITabGroup *)self.view;
[tg open:nil];
return [super windowWillOpen];
[super windowWillOpen];
}

- (void)windowDidOpen
{
// Set parent view controller for UITabBarController
TiUITabGroup *tabGroup = (TiUITabGroup *)self.view;
if (tabGroup) {
UITabBarController *tabController = [tabGroup 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];
janvennemann marked this conversation as resolved.
Show resolved Hide resolved
[tabController removeFromParentViewController];
[tabGroup close:nil];
}
return [super windowWillClose];
[super windowWillClose];
}

- (void)didReceiveMemoryWarning:(NSNotification *)notification
Expand Down
1 change: 1 addition & 0 deletions iphone/Classes/TiUITableView.m
Expand Up @@ -2423,6 +2423,7 @@ - (void)createDimmingView
dimmingView.alpha = .2;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissSearchController)];
[dimmingView addGestureRecognizer:tapGesture];
[tapGesture release];
}
}

Expand Down
17 changes: 0 additions & 17 deletions iphone/TitaniumKit/TitaniumKit/Sources/API/TiWindowProxy.m
Expand Up @@ -159,23 +159,6 @@ - (void)attachViewToTopContainerController
TiUIView *theView = [self view];
[rootView addSubview:theView];
[rootView bringSubviewToFront:theView];

// TODO: Revisit
/*
UIViewController<TiControllerContainment>* 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
Expand Down