【问题标题】: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

标签: ios swift uitabbarcontroller


【解决方案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】:

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

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

        navigationController!.setViewControllers(controllers, animated: true)
        

        在这种情况下,STACK 保存了最新设置/呈现的 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)
      

      【讨论】:

        猜你喜欢
        • 2018-01-13
        • 1970-01-01
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多