从AppDelegate中访问NavigationController指向

时间:2018-05-09 00:02:45

标签: ios swift uiviewcontroller uinavigationcontroller appdelegate

我正在使用Swift 4,我想知道如何从AppDelegate中访问故事板中我的NavigationController指向的初始视图。在这种情况下,我指向的初始视图是HotSpotRISViewController。我需要从AppDelegate中获取HotSpotRISViewController实例,以便我可以将url变量传递给它。我的故事板看起来像这样: enter image description here

如何从AppDelegate中访问我的hotSpotRISViewController实例?我知道委托及其工作原理,我知道AppDelegate首先启动应用程序,可以用于各种重要事件,例如当应用程序离开前台或在外部打开文本文件时。但是如果我没有任何方法可以访问我当前视图的实例,我无法对这些事件做任何事情,在这种情况下需要HotSpotRISViewController(这也是我的NavigationController指向的初始视图)。我猜我以某种方式使用窗口属性。提前感谢能够解答此问题的任何人。

1 个答案:

答案 0 :(得分:0)

好吧,经过几个小时的工作后我解决了。看看我的AppDelegate:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
    if let hotSpotRISViewController = UIApplication.shared.keyWindow?.rootViewController?.childViewControllers[0] as? HotSpotRISViewController {
        hotSpotRISViewController.setURL(theURL: url)
    }
}

或者你可以这样做,我认为这是首选方式:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
    if let hotSpotRISViewController = app.keyWindow?.rootViewController?.childViewControllers[0] as? HotSpotRISViewController {
        hotSpotRISViewController.setURL(theURL: url)
    }
}

不同之处在于,不使用UIApplication.shared.keyWindow,而是使用app.keyWindow,这似乎更好,因为app是应用程序的单例,并且作为此函数中的参数传入。

希望从这个例子中出现这个问题的其他任何人都可以很好地了解找到正确的ViewController需要什么。不要忘记将它强制转换为ViewController的子类,否则你将无法使用你在那里创建的任何函数。