繁体   English   中英

从应用程序委托中消除模态视图的最佳方法

[英]Best way to dismiss a modal view from app delegate

这就是我想要做的。 我正在创建一个应该处理Apple Map应用程序请求的路由应用程序。 地图应用程序通过将以下消息发送给应用程序委托来做到这一点

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

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

无论在哪里,我都希望弹出所有视图控制器以仅保留一个最顶部的视图控制器,而我知道该怎么做。 但是我也想消除任何模态视图(如果有的话),而且我不知道该怎么做。

我怎么知道模态视图(或者是否有多个可能的模型视图,不是这种情况,但我是出于疑问而问)。 我想解散吗? 是否可以直接从应用程序委托访问? 现在,我只是将模式视图控制器的指针引用保留在导航堆栈的最顶层视图控制器中,如果引用不是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:延迟一些调用dismissModalViewControllerAnimated:您可能需要对其进行一些调整)将防止由于视图控制器重新布置而导致任何动画损坏。 如果您不对这些更改进行动画处理,则直接函数调用就足够了。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM