Skip to main content
 首页 » 操作系统

ios之来自应用程序委托(delegate)的自定义 segue

2024年01月01日44落叶无声

我正在尝试从我的 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)