何时以及如何使子UIViewController无效

时间:2013-02-21 10:45:35

标签: ios objective-c uiviewcontroller childviewcontroller

我使用以下代码将子视图控制器添加到主视图控制器:

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 个答案:

答案 0 :(得分:1)

请查看关于Implementing a Custom Container View Controller的Apples View Controller Programming Guide,特别是清单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];
}