1

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

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

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

无论它在哪里,我都想弹出所有视图控制器以仅保留一个最顶层的视图控制器,而我知道该怎么做。但如果它存在,我也想关闭任何模式视图,我不知道该怎么做。

我怎么知道模态视图(或者是否有多个可能的模型视图,但事实并非如此,但我是为了这个问题而问的。)是否涵盖了它?我想解雇它?是否可以直接从应用程序委托访问?现在我只是在导航堆栈的最顶层视图控制器中保留模态视图控制器的指针引用,如果引用不为零,则关闭视图控制器。应用程序委托只是要求最顶层的视图控制器来完成这项工作。

这合适吗?

4

1 回答 1

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:(您可能需要稍微调整一下)将防止由于视图控制器重新排列而导致的任何动画损坏。如果您没有为这些更改设置动画,直接函数调用就足够了。

如果它存在,则将其关闭是实现所需功能的正确方法。

于 2013-07-23T08:02:22.603 回答