我想将导航堆栈中的一个ViewController设置为我的应用程序window.rootViewController,而我位于另一个控制器的导航堆栈中的某个位置。该其他控制器当前是我的window.rootViewController。因此,我使用以下代码:
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
appDelegate.window?.rootViewController = self
}
这只会导致黑屏。 当我从Storyboard 实例化一个新的ViewController 时,它工作正常,但是所有条目都消失了。如果可以避免,我不想重新配置新的viewController 。
更新A
我将self用作appDelegate的重要参考资料,以进行检查,因为我认为视图的视图在途中已被卸载,但仍然导致黑屏。
文档说: 根视图控制器提供窗口的内容视图。将视图控制器分配给此属性(通过编程方式或使用Interface Builder)将视图控制器的视图安装为窗口的内容视图。新的内容视图配置为跟踪窗口大小,并随窗口大小的变化而变化。如果该窗口具有现有的视图层次结构,则在安装新视图之前,先删除旧视图。
说明:我不想实例化一个新的VC,我想使用当前的VC,而不必在其周围放置navigationController,所以这是没有必要的。我确信没有任何解决方法是有可能的,我只是在这里遗漏了一些东西。
答案 0 :(得分:2)
更精确地说,您可以将导航控制器与视图控制器一起使用
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let appDelegate = UIApplication.shared.delegate as? AppDelegate
let initialViewController = storyboard.instantiateViewController(withIdentifier: "yourViewController") as! yourViewController
let nvc: UINavigationController = UINavigationController(rootViewController: initialViewController)
appDelegate?.window?.rootViewController = nvc
appDelegate?.window?.makeKeyAndVisible()
答案 1 :(得分:1)
文档说:根视图控制器提供了窗口的内容视图。将视图控制器分配给此属性(通过编程方式或使用Interface Builder)将视图控制器的视图安装为窗口的内容视图。新的内容视图配置为跟踪窗口大小,并随窗口大小的变化而变化。 如果该窗口具有现有的视图层次结构,则在安装新视图之前,先删除旧视图。
正如文档所述:如果交换了rootViewController,它将删除堆栈中的所有视图。无论控制器是什么。因此,我必须从堆栈中删除自己,以确保不会删除我的视图。这导致了以下解决方案:
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
guard let pageVC = self.onboardingDelegate as? OnboardingPageViewController else { return } // my current stack is in a pageViewController, it also is my delegate
let vc = self // holding myself
pageVC.subViewControllers.removeLast() // removing myself from the list
pageVC.setViewControllers([pageVC.subViewControllers[0]], direction: .forward, animated: false, completion: nil) // remove the current presented VC
appDelegate.window?.rootViewController = vc
vc.onboardingDelegate = nil
appDelegate.window?.makeKeyAndVisible()
}
它运行正常,就像我想要的那样。
答案 2 :(得分:1)
您必须先将其从导航控制器中删除,然后再将其设置为根视图控制器:
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
willMove(toParentViewController: nil)
view.removeFromSuperview()
removeFromParentViewController()
appDelegate.window?.rootViewController = self
}
注意:这不是最好的方法,您应该重新访问导航堆栈。
答案 3 :(得分:0)
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
let objLoginViewController = UIStoryboard(name: "Main", bundle:nil).instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
appdelegate.window?.rootViewController = objLoginViewController
appdelegate.window?.makeKeyAndVisible()
}
如果您不想实例化新控制器,则可以找到 导航堆栈中的控制器并分配到 rootViewController
答案 4 :(得分:0)
您处在正确的轨道上,只是将自己添加到NavigationController ,然后将其设置为 rootViewController 和 makeKeyAndVisible 窗口。 / p>
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
let nav = UINavigationController(rootViewController: self)
// IF YOU DON'T WANT NAVIGATION BAR, set it hidden
nav.navigationBar.isHidden = true
appDelegate.window?.rootViewController = nav
appDelegate.window?.makeKeyAndVisible()
}
尝试并分享您的结果!