我使用以下代码将子视图控制器添加到主视图控制器:
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。
为什么这样做,我应该管理子视图控制器的删除,不同的是,子视图控制器正在管理触发删除子控制器的按钮。
非常感谢。
答案 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];
}