如何从 AppDelegate 实例化 UIViewController?

Posted

技术标签:

【中文标题】如何从 AppDelegate 实例化 UIViewController?【英文标题】:How to instantiate a UIViewController from AppDelegate? 【发布时间】:2017-04-04 03:23:12 【问题描述】:

我的应用中有以下设置:

有一个包含 3 个视图控制器(A、B 和 C)的容器视图。我可以通过向左或向右滑动来从 A、B 或 C 切换。 A 或 B 都包含自己的集合视图。如果我在 A 或 B 内的集合视图中点击任何单元格,PlayerVC(上图中名为 Player ^^)就会启动并开始使用 AVPlayer 播放视频。

问题是:

此应用可以分享Universal Links,因此当用户点击universal link 时,它会将他们直接带到应用,启动PlayerVC,然后开始播放视频。问题是如果用户在点击universal link 时被直接带到PlayerVC,我该如何初始化其他视图控制器?或者如何从app delegatePlayerVC

这里有一些场景:

如果用户被直接带到PlayerVC,那么如果他们关闭PlayerVC,应用程序就会崩溃。 如果应用程序已经启动但处于后台模式,假设用户在view controller B,那么当用户点击universal link时,我如何从view controller B转到PlayerVC?李>

这是app delegate 中的委托方法,当用户点击universal link 时会调用该方法(请注意HELP 注释):

class AppDelegate: UIResponder, UIApplicationDelegate 
    // Other App Delegate methods.....

    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool 

        // 1) Make sure the passed `user activity` has expected characteristics.
        guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL else 
            return false
        

        // HELP: I need to get to `PlayerVC` from here?

        return true

        // If we can't do the above we default to opening the page in safari
    

注意: 我们的应用正在运行 ios 10。我们正在使用 Apple 的通用链接新 api:https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html

有什么想法吗?

【问题讨论】:

【参考方案1】:

问题是:

此应用能够共享通用链接,因此当用户点击 通用链接,它将他们直接带到应用程序,启动 PlayerVC,并开始播放视频。问题是我该怎么做 如果用户被直接带到,则初始化其他视图控制器 PlayerVC 如果他们点击通用链接?或者如何到达 来自应用委托的 PlayerVC?

对于这个问题,您需要先实例化容器及其子视图控制器,然后才能显示 PlayerVC

如果用户被直接带到 PlayerVC,那么如果他们关闭 应用程序崩溃的 PlayerVC。

按照我告诉你的实现,它不应该崩溃。总会有一个容器控制器被实例化

如果应用已经启动但处于后台模式,假设 用户在视图控制器 B 中,然后当用户点击通用 链接,如何从视图控制器 B 转到 PlayerVC?

您可以在 AppDelegate 中存储容器控制器的全局变量。有了这个你可以访问控制器B。然后你可以调用

container.present(playerVC, animated: true, completion: nil)

【讨论】:

嘿,感谢 cmets。我将如何根据我的问题来实例化容器及其子视图控制器?你能提供一个代码示例吗?谢谢

以上是关于如何从 AppDelegate 实例化 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode & Swift - 无法从 AppDelegate 实例化另一个视图控制器

使用 AppDelegate 中的 Storyboard 以编程方式实例化视图控制器

如何在不使用 Nib 的情况下实例化和调用 UIView 子类

如何使用没有选项卡或导航控制器的故事板从 AppDelegate 实例化不同的视图?

从 SceneDelegate 实例化时如何获取完整的 viewController

我们可以在AppDelegate中实例化核心数据的单个对象并在整个应用程序中使用它吗?