回到初始视图控制器

back to initial view controller

如您所见,我有一个带有标签的初始视图控制器"Initial ViewController"。在此视图控制器中,我使用以下代码转到 Tab Bar Controller

的选定选项卡
let vc1 = sb.instantiateViewController(withIdentifier: "tabbar") as! UITabBarController
vc1.selectedIndex = selected
let controllers = [vc1]
navigationController!.setViewControllers(controllers, animated: true)

在我的第一个视图中,有一个按钮 "Present VC",它显示 "Presented View"

let vc1 = sb.instantiateViewController(withIdentifier: "PresentedVC") as! PresentedVC
present(vc1, animated: true, completion: nil)

现在我想从呈现的 vc 返回到根目录 vc(初始视图控制器)。我可以这样做:

let viewController = self.storyboard?.instantiateViewController(withIdentifier: "FirstNavigationController") as! FirstNavigationController
UIApplication.shared.keyWindow?.rootViewController = viewController 

但是每次都会实例化初始视图控制器并且视图保留在内存中。我如何在不实例化它的情况下返回初始视图控制器?

PS: FirstNavigationController 是初始导航控制器。

一开始你通过这样做删除初始视图控制器:

navigationController!.setViewControllers(controllers, animated: true)

所有以前的 viewControllers 现在都消失了,取而代之的是 tabbar controller 及其子控制器。

如果您想回到初始控制器,您必须将标签栏压入堆栈,而不是用它替换所有内容。例如

navigationController?.pushViewController(tabbarVc, animated: true)

第一次这样做时

 navigationController!.setViewControllers(controllers, animated: true)

释放初始 VC(如果它没有强引用)

要保留它,您可以使用 push 、 pop 而不是 setViewControllers 但请注意,如果您的应用程序中有大量处理,它可能会导致内存问题,因为它将保留在 navigationController 堆栈中

您缺少 "Presenting" 或 "Setting" 视图控制器与 "Navigating" 视图控制器之间的概念。一旦你理解了这个概念,你就会得到答案。在这里,它是..

  1. 当您设置 ViewController 时,您将堆栈容器完全替换为新的视图控制器。你在这里做的方式:

    navigationController!.setViewControllers(controllers, animated: true)
    

    在这种情况下,STACK 保存最新的 set/presented ViewController 的地址,这意味着之前的整个 ViewController 消失了。

  2. 另一方面,如果您通过推送导航到其他视图控制器。您可以通过简单地从堆栈中弹出 ViewController 地址来返回到以前的控制器。或按下 ViewController 例如:

    self.navigationController?.pushViewController(tabbarVc, animated: true)
    
    self.navigationController?.popViewController(animated: true)
    

总结:

如果你按下 TabBarController 然后,只有你会得到 InitialVC.

现在,在您的情况下,您正在设置 ViewController,因此,您没有获得 InivtialVC。 尝试推送 tabbarVC 这会起作用。

navigationController?.pushViewController(tabbarVc, animated: true)