Swift:如何确保没有无限的ViewController堆叠在一起(如果需要,如何解除它们)?

时间:2017-12-26 20:56:55

标签: ios swift uiviewcontroller presentviewcontroller dismissviewcontroller

我正在界面构建器中创建一个带有三个ViewController的简单应用程序。现在他们按顺序出现:

  

FirstVC> SecondVC> ThirdVC

  1. FirstVC
  2. 显示主菜单,通过界面构建​​器连接播放按钮以显示SecondVC(现在没有代码)。

    1. SecondVC
    2. 一个简单的游戏。当游戏结束时,我以编程方式呈现ThirdVC。

      let storyboard = UIStoryboard(name: "Main", bundle: nil)
          let vc = storyboard.instantiateViewController(withIdentifier: "GameOverScreen") as UIViewController
          vc.modalPresentationStyle = UIModalPresentationStyle.currentContext
          vc.modalTransitionStyle = .crossDissolve
      
          self.present(vc, animated: true, completion: nil)
      

      在呈现ThirdVC之前(或同时)我想解雇SecondVC,以便仅在层次结构中:

        

      FirstVC> ThirdVC

      存在。

      1. ThirdVC
      2. 显示一条基于消息的简单游戏。

        dismiss(animated: true, completion: nil)
        

        当我解雇这个视图控制器时,我想回到FirstVC,或者更确切地说因为SecondVC已经被解雇,玩家会自动回到FirstVC。

        我该怎么做? 当然我知道如何以编程方式呈现和解散VC,但是如何在呈现新VC的同时解雇VC呢?或者这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

你最好使用navigationcontroller,当推送ThirdVC时,在它的viewDidLoad中执行此操作

 func optimizeNavigation()
{


    let viewControllers: [UIViewController] = self.navigationController!.viewControllers ;

    print("before optimize \(viewControllers.count)")

    for aViewController in viewControllers
    {
        if(aViewController is SecondVC)
        {
           aViewController.removeFromParentViewController()
        }
    }

      let viewControllers2: [UIViewController] = self.navigationController!.viewControllers ;

      print("after optimize \(viewControllers2.count)")

}

这样当您在ThirdVC中弹出时,您将返回到FirstVC