Ios 何时以及如何取消子UIViewController

Ios 何时以及如何取消子UIViewController,ios,objective-c,uiviewcontroller,childviewcontroller,Ios,Objective C,Uiviewcontroller,Childviewcontroller,我正在使用以下代码将子视图控制器添加到主视图控制器: HPSPhotoLibraryOverlayController* controller = [[HPSPhotoLibraryOverlayController alloc] init]; [self.view addSubview:controller.view]; [self addChildViewController:controller]; [controller didMoveToParentViewController:s

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

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
{
   [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),子视图控制器似乎被设置为nilphotoLibraryRequestingClose方法尚未返回,但我正在取消调用photoLibraryRequestingClose的子视图控制器

我正在使用ARC

为什么会这样做?我应该以不同的方式管理子视图控制器的移除,记住触发移除子控制器的按钮是由子视图控制器管理的


非常感谢。

请查看Apple 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];
}

请查看Apple 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];
}