我正在尝试从我的 AppDelegate 执行转场.我知道我实际上无法从 AppDelegate 执行 segue ,因为 segue 是从一个场景到另一个场景的过渡,所以我实例化了两个 ViewControllers关心我的AppDelegate
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let loadingViewController = storyboard.instantiateViewControllerWithIdentifier("loadingViewController") as UIViewController
let loginViewController = storyboard.instantiateViewControllerWithIdentifier("loginViewController") as UIViewController
let mainViewController = storyboard.instantiateViewControllerWithIdentifier("mainViewController") as UIViewController
然后,我尝试 loadingViewController.performSegueWithIdentifier("segueToLogin", sender: self)其中 segueToLogin是我 Storyboard中的自定义 segue 标识符
我得到的错误(不会使应用程序崩溃)是
Tacklebox[27258:1016738] Warning: Attempt to present <Tacklebox.LoginViewController: 0x7fd8a9646bd0> on <Tacklebox.LoadingViewController: 0x7fd8a943d940> whose view is not in the window hierarchy!
最终结果是我留在sourceViewController , loadingViewController .
请您参考如下方法:
问题是您已经在 App Delegate 中创建了这些 View Controller ,但由于您没有使用这些特定实例在 View 之间导航,因此这些 View Controller 实例实际上与堆栈中的 View Controller 不同;因此错误说 LoadingViewController 实例你试图继续“不在窗口层次结构中。”
您将必须获取事件 LoadingViewController 的实例。由于您从中执行 segue 的 View Controller 必然是(即应该是)可见的,并且因为(如您的 Storyboard 所示),rootViewController 是一个 UINavigationController,试试这个来访问导航层次结构中的当前 LoadingViewController:
let navigationController = self.window?.rootViewController as UINavigationController
let loadingViewController = navigationController.visibleViewController as LoadingViewController
loadingViewController.performSegueWithIdentifier("segueToLogin", sender: self)
