2013-02-21 35 views
1

我使用下面的代码添加子视图控制器我的主视图控制器:何时以及如何以抵消孩子的UIViewController

HPSPhotoLibraryOverlayController* controller = [[HPSPhotoLibraryOverlayController alloc] init]; 

[self.view addSubview:controller.view]; 

[self addChildViewController:controller]; 
[controller didMoveToParentViewController:self]; 

孩子视图控制器控制该视图包含一个按钮,敲击时应该从主视图控制器中删除子视图和子视图控制器。

在子视图控制器的方法,使得当按钮被按下时看起来像这样运行:

-(void)photoLibraryCloseButtonTapped:(id)sender 
{ 
    [self.view removeFromSuperview]; 

    [(HPSFormController*)_parentController photoLibraryRequestingClose]; 
} 

然后在主视图控制器的方法,将关闭子视图控制器看起来像这样:

-(void)photoLibraryRequestingClose 
{ 
    UIViewController* controllerToRemove; 
    for (UIViewController* controller in self.childViewControllers) { 
     if ([controller isKindOfClass:[HPSPhotoLibraryOverlayController class]]) 
     { 
      [controller removeFromParentViewController]; 
      controllerToRemove = controller; 
     } 

    } 

    if (controllerToRemove) 
    { 
     controllerToRemove = nil; 
    } 

} 

此代码全部有效。然而,在我看来,子视图控制器被设置为nil,而子视图控制器的 - (void)photoLibraryCloseButtonTapped:(id)sender方法仍在运行(即 - (void)photoLibraryRequestingClose方法尚未返回,但我抵消已经调用photoLibraryRequestingClose子视图控制器。

我使用ARC。

为什么这工作,我应该管理记住不同的轴承去除子视图控制器的按钮触发子控制器正在被子视图控制器管理的移除。

非常感谢。

回答

1

请看看苹果视图控制器编程指南关于Implementing a Custom Container View Controller尤其是在上市14-2:

- (void) hideContentController: (UIViewController*) content 
{ 
    [content willMoveToParentViewController:nil]; 
    [content.view removeFromSuperview]; 
    [content removeFromParentViewController]; 
} 

回答你的问题,你应该改变这样的代码:

- (void)photoLibraryCloseButtonTapped:(id)sender 
{ 
    [(HPSFormController*)_parentController photoLibraryControllerRequestingClose:self]; 
} 

- (void)photoLibraryControllerRequestingClose:(UIViewController *)childController 
{ 
    [childController willMoveToParentViewController:nil]; 
    [childController.view removeFromSuperview]; 
    [childController removeFromParentViewController]; 
} 
+0

太好了 - 谢谢SOPH – Journeyman 2013-02-21 14:08:00

相关问题