【问题标题】:Best way to dismiss a modal view from app delegate从应用程序委托中关闭模式视图的最佳方法
【发布时间】:2013-07-23 07:23:39
【问题描述】:

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

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

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

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

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

这样合适吗?

【问题讨论】:

    标签: ios ios6 modal-dialog


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-09
      • 2013-10-29
      • 2015-08-22
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多