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