从 App Delegate 打开导航控制器

Posted

技术标签:

【中文标题】从 App Delegate 打开导航控制器【英文标题】:Open Navigation Controller from App Delegate 【发布时间】:2017-09-28 14:53:31 【问题描述】:

我已经实现了一个 URL 方案,用于在付款后重定向回我的应用程序。当网页直接返回我的应用程序时,应用程序应该在当前视图上打开一个导航控制器。 (所以打开它模式)。

如何通过func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool-方法中的 AppDelete 执行此操作?

提前致谢!

【问题讨论】:

Opening view controller from app delegate using swift的可能重复 @the4kman 嗨,不同的是我想在当前视图上打开它。 您的目标版本是什么?比 ios 9 高吗? @MassimilianoDelMaestro 是的! iOS 10+ @RickdeJong 然后要小心,无论您使用何种方法以模态方式呈现您的视图,方法“application(_ application:open:sourceApplication:annotation:) -> Bool”自 iOS 9 起已弃用。请改用较新的“application(_:open:options:)”。 【参考方案1】:

您是在使用情节提要还是在委托中手动创建窗口?如果您有权访问该窗口,则可以这样做:

window?.rootViewController?.present(yourViewController, animated: true, completion: nil)

否则,它应该适用于所有情况:

UIApplication.shared.keyWindow?.rootViewController?.present(yourViewController, animated: true, completion: nil)

【讨论】:

您好!我正在使用故事板。是否可以通过模态转换来做到这一点? 这是一个模态转换。您可以通过 yourViewController. modalTransitionStyle 自定义它或自定义 yourViewController. modalPresentationStyle【参考方案2】:

如果提交请求的视图控制器应该显示模式,我会建议一种不同的方法。我建议在通知中心定义一个通知,用于通知当前视图控制器。

在您的视图控制器中,调用通知中心方法之一,例如addObserver(forName:object:queue:using:) 以观察您的通知。

然后,当您获得预期的 URL 时,从您的应用代理的 application(_:open:options:) 实现中调用 Notification 之类的 post(name:object:) 方法。

【讨论】:

以上是关于从 App Delegate 打开导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

多控制器和导航控制器简单介绍

如何从 App 委托导航内部视图控制器

如何从“菜单”视图控制器在现有 UIViewControllers 之间导航?

无法在 App Delegate (Swift) 中更新 titleView 图像

自定义视图控制器展示导致导航栏弹跳

从打开的导航抽屉呈现视图控制器时挂起