如何将self设置为新的window.rootViewController?

时间:2018-08-29 11:03:05

标签: ios swift

我想将导航堆栈中的一个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,所以这是没有必要的。我确信没有任何解决方法是有可能的,我只是在这里遗漏了一些东西。

5 个答案:

答案 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()
}

尝试并分享您的结果!