Ios 从应用程序委派中取消模式视图的最佳方法

Ios 从应用程序委派中取消模式视图的最佳方法,ios,ios6,modal-dialog,Ios,Ios6,Modal Dialog,这就是我要做的。 我正在创建一个路由应用程序,可以处理来自Apple map应用程序的请求。地图应用程序通过向应用程序代理发送以下消息来执行此操作 -(BOOL)应用程序:(UIApplication*)应用程序 openURL:(NSURL*)url 源应用程序:(NSString*)源应用程序 注释:(id)注释 问题是,我的应用程序可能已经在执行,并且在此时处于任何状态。它可能在导航堆栈中有好几层,也可能在导航堆栈中只有一个根控制器,但当前有一个模式视图覆盖了它 无论在哪里,我都希望弹出所

这就是我要做的。 我正在创建一个路由应用程序,可以处理来自Apple map应用程序的请求。地图应用程序通过向应用程序代理发送以下消息来执行此操作

-(BOOL)应用程序:(UIApplication*)应用程序
openURL:(NSURL*)url
源应用程序:(NSString*)源应用程序
注释:(id)注释

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

无论在哪里,我都希望弹出所有视图控制器,只保留一个最顶层的视图控制器,我知道如何做到这一点。但我也想排除任何模态视图,如果它存在的话,我不知道怎么做

我如何知道模态视图(或者如果有多个可能的模型视图,情况并非如此,但我问它是为了回答问题)是否覆盖了它?我想放弃它?是否可以直接从应用程序代理访问?现在,我只是在导航堆栈最顶层的视图控制器中保留模态视图控制器的指针引用,如果引用不是nil,则关闭视图控制器。应用程序代理只要求最顶层的视图控制器执行此任务


这是否正确?

如果您使用的是导航控制器,则可以轻松访问其
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:
稍微延迟一点(您可能希望对其进行一点调整),可以防止由于视图控制器重新排列而导致的任何动画损坏。如果没有设置这些更改的动画,则直接调用函数就足够了

如果它存在,就将其丢弃是实现所需功能的正确方法