1

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

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;
    }

}

这段代码一切正常。但是,在我看来,子视图控制器被设置为零,而子视图控制器的 -(void)photoLibraryCloseButtonTapped:(id)sender 方法仍在运行(即 -(void)photoLibraryRequestingClose 方法尚未返回,但是我正在取消调用 photoLibraryRequestingClose 的子视图控制器。

我正在使用 ARC。

为什么这行得通,我是否应该以不同的方式管理子视图控制器的删除,记住触发子控制器删除的按钮是由子视图控制器管理的。

非常感谢。

4

1 回答 1

1

请查看 Apples View Controller Programming Guide about 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];
}
于 2013-02-21T13:53:53.137 回答