回到初始视图控制器
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)
【讨论】:
以上是关于回到初始视图控制器的主要内容,如果未能解决你的问题,请参考以下文章