ios - 何时以及如何使子 UIViewController 无效

标签 ios objective-c uiviewcontroller childviewcontroller

我正在使用以下代码将 subview Controller 添加到我的主视图 Controller :

HPSPhotoLibraryOverlayController* controller = [[HPSPhotoLibraryOverlayController alloc] init];

[self.view addSubview:controller.view];

[self addChildViewController:controller];
[controller didMoveToParentViewController:self]; 

subview Controller 控制的 View 包含一个按钮,当点击该按钮时应该从主视图 Controller 中删除 subview 和 subview Controller 。

按下按钮时运行的 subview Controller 中的方法如下所示:

-(void)photoLibraryCloseButtonTapped:(id)sender
{
   [self.view removeFromSuperview];

   [(HPSFormController*)_parentController photoLibraryRequestingClose];
}

然后主视图 Controller 中关闭 subview Controller 的方法如下所示:

-(void)photoLibraryRequestingClose
{
    UIViewController* controllerToRemove;
    for (UIViewController* controller in self.childViewControllers) {
        if ([controller isKindOfClass:[HPSPhotoLibraryOverlayController class]])
        {
            [controller removeFromParentViewController];
            controllerToRemove = controller;
        }

    }

    if (controllerToRemove)
    {
        controllerToRemove = nil;
    }

}

这段代码全部有效。但是,在我看来, subview Controller 被设置为 nil,而 subview Controller 的 -(void)photoLibraryCloseButtonTapped:(id)sender 方法仍在运行(即 -(void)photoLibraryRequestingClose 方法尚未返回,但是我正在取消调用 photoLibraryRequestingClose 的 subview Controller 。

我正在使用 ARC。

为什么会这样,我应该以不同的方式管理 subview Controller 的删除,同时记住触发子 Controller 删除的按钮是由 subview Controller 管理的。

非常感谢。

最佳答案

请查看有关 Implementing a Custom Container View Controller 的 Apples View Controller 编程指南特别是在 list 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];
}

关于ios - 何时以及如何使子 UIViewController 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15000248/

相关文章:

iphone - UIPageViewController 在旋转时重置为第一页

ios - 将 nsstring 的最后 6 个或 8 个字符与其他 nsstring 进行比较

iOS UI 通知栏过渡

ios - 为什么返回 View 时获取的数据不消失?

ios - UIView 内部的 UITableView 与第一个单元格静态

ios - 在 Xcode 中使用带有 NSMutableArray 的过滤器函数

android - 最佳实践讨论 : When to favor a webview over a native UI in titanium?

objective-c - NSTextAlignment 不能在 Objective-C 中表示

iphone - 在这种情况下我应该使用全局 bool 变量吗?

ios - 如何为 iphone 应用程序设置代码框架