回到初始视图控制器

Posted

技术标签:

【中文标题】回到初始视图控制器【英文标题】:back to initial view controller 【发布时间】:2018-02-27 08:08:19 【问题描述】:

如您所见,我有一个带有标签的初始视图控制器“初始视图控制器”。在这个视图控制器中,我使用下面的代码转到 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.popToRootViewControllrt() @SPatel 我在我的第一个视图中甚至使用了 navigationcontroller.popToRootViewControllrt() 并且它不会进入 InitialVC @Hos Ap 如果你去以前的视图控制器使用 popViewControllerAnimated 或者如果你想去根视图控制器使用 popToRootViewController。如果你有多个,你还有一个选项,就是将所有视图控制器添加到数组并使用 popViewController:animated 【参考方案1】:

在一开始,您可以通过以下方式删除初始视图控制器:

navigationController!.setViewControllers(controllers, animated: true)

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

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

navigationController?.pushViewController(tabbarVc, animated: true)

【讨论】:

【参考方案2】:

你第一次这样做的时候

 navigationController!.setViewControllers(controllers, animated: true)

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

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

【讨论】:

【参考方案3】:

您缺少“呈现”或“设置”视图控制器与“导航”视图控制器之间的概念。一旦你理解了这个概念,你就会得到答案。来了。。

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

    navigationController!.setViewControllers(controllers, animated: true)
    

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

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

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

总结:

如果你按下TabBarController,那么只有你会得到InitialVC

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

navigationController?.pushViewController(tabbarVc, animated: true)

【讨论】:

以上是关于回到初始视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

UIViewController 不会弹出

将 UIViewController 子视图重置回初始位置

回到视图控制器的前一个实例

Swift 回到根视图控制器

如何回到不同故事板的先前视图控制器?

我应该使用 presentViewController 回到第一个视图控制器吗?