繁体   English   中英

从Appdelegate获取ViewController

[英]Get ViewController from Appdelegate

我的故事板中有四个视图

  1. ViewOne
  2. ViewTwo
  3. ViewThree
  4. ViewFour

在我的ViewTwo ,我打电话并打开一个新的应用程序,当URL打开完成后,我在Appdelegate调用以下函数

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool

我在这里所做的是,我要遍历所有viewControllers,因为我想找到ViewTwo以便能够调用我创建的segue。 我想这样做,因为我不想创建viewController的新实例。

通过下面的此功能可以很好地找到ViewTwo

if let viewControllers = window?.rootViewController?.childViewControllers {
    for viewController in viewControllers {
        if viewController.isKindOfClass(ViewTwo) {
            viewController.performSegueWithIdentifier("sw", sender: self)
        }
    }
}

但是现在我已经向ViewTwoViewThreeViewFour添加了NavigationController ,因此当我运行上面的代码片段时,我只会得到viewController的以下结果(我做了一个简单的print(viewController)

<ViewOne: 0x...>
<UINavigationController: 0x...>
<UINavigationController: 0x...>
<UINavigationController: 0x...>

所以我的问题是,既然我也有NavigationController,如何检查ViewTwo?

我解决了

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewControllerWithIdentifier("ViewThree") as! WebViewController
self.window?.rootViewController!.presentViewController(controller, animated: true, completion: { () -> Void in

})

您可以从情节提要中获取视图控制器,而无需创建新实例。 您不需要遍历所有视图控制器。 另外,为什么不将视图控制器设置为导航控制器的根目录而不是执行segue?

您可以从情节提要中获取视图控制器,如下所示:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewControllerWithIdentifier("ViewTwo") as! ViewTwoViewController

因为现在您都可以使用UINavigationViewController 它仅仅是控制器的控制器。 您可以通过访问viewControllers属性的第一个元素,从UINavigationViewController访问根视图控制器。 然后,您可以进行插值。

根视图控制器位于数组的索引0中,后视图控制器位于索引n-2处,而顶部控制器位于索引n-1中,其中n是数组中的项数。

暂无
暂无

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

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