Swift:如何确保没有无限的 ViewController 堆叠在一起(如果需要,如何关闭它们)? [复制]

Posted

技术标签:

【中文标题】Swift:如何确保没有无限的 ViewController 堆叠在一起(如果需要,如何关闭它们)? [复制]【英文标题】:Swift: How to make sure that no infinite ViewController are stacked on top of each other (how to dismiss them if necessary)? [duplicate] 【发布时间】:2017-12-26 20:56:54 【问题描述】:

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

FirstVC > SecondVC > ThirdVC

    第一VC

显示主菜单,通过界面生成器连接播放按钮以显示 SecondVC(目前没有代码)。

    第二个VC

一个简单的游戏。游戏结束后,我以编程方式呈现 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 以便仅在层次结构中:

第一VC>第三VC

存在。

    第三个VC

显示一个简单的游戏结束消息。

dismiss(animated: true, completion: nil)

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

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

【问题讨论】:

“我当然知道如何以编程方式呈现和关闭 VC” 然后你就知道答案了。解散 SecondVC,然后呈现 ThirdVC。 这就是问题所在。它不适用于简单的 dismiss(animated: completion:) 函数。我该怎么做? 返回2级:self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil) 你会那样做。但是我看不到您的代码,所以我无法提供进一步的帮助。请注意,如果您要说dismiss(animated:true),则必须在completion 函数中执行present 它实际上不是重复的,因为我不想在 FirstVC 和 SecondVC 之上显示 ThirdVC,并且当用户关闭 ThirdVC 时,ThirdVC 和 SecondVC 都会被解雇。我希望展示 ThirdVC 并同时关闭 SecondVC(好像它从未存在过,所以基本上让 ThirdVC 成为新的 SecondVC)。 【参考方案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

【讨论】:

以上是关于Swift:如何确保没有无限的 ViewController 堆叠在一起(如果需要,如何关闭它们)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spriteKit swift 4 中制作无限背景

SWIFT4:如何让两个点击手势识别器一起工作

swift-如何确保最初在哪个协议或类型中定义了特定属性?

中国如何在被踢出SWIFT系统情况下确保本国金融安全?

我如何确保Producer和Consumer线程一个接一个地无限运行?

iOS Swift 如何告诉 UIView 控制器我们通过 NSURLProtocol 对象接收到信息