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 7c9307a4772..95fcb7be5c3 100644 --- a/iphone/Classes/TiMediaVideoPlayer.m +++ b/iphone/Classes/TiMediaVideoPlayer.m @@ -7,8 +7,10 @@ #ifdef USE_TI_MEDIAVIDEOPLAYER #import "TiMediaVideoPlayer.h" +#import #import #import +#import #import @implementation TiMediaVideoPlayer @@ -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); @@ -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; @@ -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]; diff --git a/iphone/Classes/TiMediaVideoPlayerProxy.m b/iphone/Classes/TiMediaVideoPlayerProxy.m index b5d50307506..7fcabea2886 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 diff --git a/iphone/Classes/TiUIListView.m b/iphone/Classes/TiUIListView.m index 6aecf323e73..2a22507983e 100644 --- a/iphone/Classes/TiUIListView.m +++ b/iphone/Classes/TiUIListView.m @@ -2417,6 +2417,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 28d056b3fb4..f402e739085 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,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 diff --git a/iphone/Classes/TiUITabGroupProxy.m b/iphone/Classes/TiUITabGroupProxy.m index 24973f8ddaa..5c512b49bd4 100644 --- a/iphone/Classes/TiUITabGroupProxy.m +++ b/iphone/Classes/TiUITabGroupProxy.m @@ -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]; + [tabController removeFromParentViewController]; [tabGroup close:nil]; } - return [super windowWillClose]; + [super windowWillClose]; } - (void)didReceiveMemoryWarning:(NSNotification *)notification diff --git a/iphone/Classes/TiUITableView.m b/iphone/Classes/TiUITableView.m index 393101e841c..bb372628f33 100644 --- a/iphone/Classes/TiUITableView.m +++ b/iphone/Classes/TiUITableView.m @@ -2423,6 +2423,7 @@ - (void)createDimmingView dimmingView.alpha = .2; UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissSearchController)]; [dimmingView addGestureRecognizer:tapGesture]; + [tapGesture release]; } } 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