从app delegate中解除模态视图的最佳方法

时间:2013-07-23 07:23:40

标签: ios ios6 modal-dialog

这是我正在尝试做的事情。 我正在创建一个应该处理Apple地图应用程序请求的路由应用程序。地图应用程序通过向应用程序委托发送以下消息来实现此目的

- (BOOL) application: (UIApplication *) application openURL:(NSURL *) url sourcApplication:(NSString *)sourceApplication annotation:(id)annotation

问题是,我的应用程序已经可以执行并且此时处于任何状态。它可能是导航堆栈中的几层深,也可能是导航堆栈中只有一个根控制器,但目前正在覆盖模态视图。

无论如何,我想弹出所有视图控制器以保留一个最顶层的视图控制器,我知道如何这样做。但我也想解雇任何模态视图,如果它存在,我不知道该怎么做。

我如何知道模态视图(或者是否存在多个可能的模型视图,而不是这种情况,但我是为了问题而问它。)是否覆盖它?而且我想解雇它?是否可以直接从应用代理访问?现在我只是在导航堆栈的最顶层视图控制器中保留模态视图控制器的指针引用,并且如果引用不是nil则关闭视图控制器。 app delegate只是要求最顶层的视图控制器完成这项工作。

这是正确的吗?

1 个答案:

答案 0 :(得分:2)

如果您正在使用导航控制器,则可以轻松访问其topViewcontroller并检查它是否已从您的应用程序委托类中提供了另一个视图控制器。在iOS 6.0之前,您想要使用的访问器是“modalViewController”,之后它被标记为已弃用,因此您应该使用presentedViewController

这种检查的一个例子是这样的:

// after rearranging view controller hierarchy, check for modal view controllers

UIViewController *topVc = [navigationController topViewController];
if ([vc presentedViewController] != nil) {
    [vc performSelector:@selector(dismissModalViewControllerAnimated:) 
             withObject:[NSNumber numberWithBool:YES]
             afterDelay:0.5];
}

稍微调用dismissModalViewControllerAnimated:(您可能想稍微调整一下)可以防止由于视图控制器重新排列而导致的任何动画损坏。如果您没有动画这些更改,则直接函数调用就足够了。

如果它存在,则解雇它是实现所需功能的正确方法。