在AppDelegate中更改根视图控制器时出现黑屏

问题描述:

我试图从应用程序代理的didFinishLaunchingWithOptions更改根视图控制器,具体取决于用户是否登录。一旦我得到过去的这个条件,我使用下面的代码更改根视图控制器:在AppDelegate中更改根视图控制器时出现黑屏

self.window = UIWindow(frame: UIScreen.main.bounds) 
self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SWRevealViewController") as! SWRevealViewController 

self.window?.makeKeyAndVisible() 

然而,当我启动应用程序(在用户的有效记录的)模拟器首先显示登录屏幕(旧的根视图控制器)一秒钟,然后屏幕变黑约30秒到一分钟,然后才显示出所需的视图控制器。

在故事板视图控制器结构如下:

SWRevealViewController - >导航控制器 - >期望的视图控制器(新的根)

其原因开始与SWRevealViewController是因为滑动菜单被否则会损失的。

任何想法可能会发生什么?

+0

你可以在创建窗口键之前设置'rootViewController' *吗? – NRitH

+0

@NRitH结果完全一样。 – rodrigochousal

+0

你能展示一些更多的代码吗?看看你如何设置loginViewController以及触发你显示的代码会很有用。 –

下面是一个例子,它适用于我,只是使您的loginViewControllers成为UINavigationController的堆栈,与SWRevealController无关。这很容易解决。

self.window = UIWindow(frame: UIScreen.main.bounds) 
if User.shared.firstLaunch { 
    let navigationVC = Storyboard.inital.instantiateViewController(withIdentifier: "firstLaunchNC") as! UINavigationController 
    self.window?.rootViewController = navigationVC 
} else if User.shared.token == "" { 
    let navigationVC = Storyboard.inital.instantiateViewController(withIdentifier: "initialVC") as! UINavigationController 
    self.window?.rootViewController = navigationVC 
} else { 
    self.registerForPushNotifications(application: UIApplication.shared) 
    User.shared.refreshToken() 
    let revealController = Storyboard.main.instantiateViewController(withIdentifier: "revealViewController") as! SWRevealViewController 
    self.window?.rootViewController = revealController 
} 

self.window?.makeKeyAndVisible() 
return true 

我找到了一种方法来产生与我想要的结果类似的结果。它包括不改变根视图控制器所有,并让它升空后提出了一个“人造根视图控制器”:

if let currentRoot = self.window?.rootViewController { 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let artificialRoot = storyboard.instantiateViewController(withIdentifier: "SWRevealViewController") 
    currentRoot.present(artificialRoot, animated: false, completion: nil) 
} 

虽然并不理想,这种实现的结果远远比实施更好问题描述。