【问题标题】:How to dismiss 2 view controller in swift ios? [closed]如何在 swift ios 中关闭 2 个视图控制器? [关闭]
【发布时间】:2015-03-12 16:13:24
【问题描述】:

如何在 Swift iOS 中关闭 2 个视图控制器?

下面是我的代码。

@IBAction func backButtonTapped(sender: AnyObject) {
    self.presentingViewController
        .presentingViewController
        .dismissViewControllerAnimated(true, completion: nil)
}

【问题讨论】:

标签: ios swift uiviewcontroller dismissviewcontroller


【解决方案1】:

Swift 3+ 版本。您可以使用以下代码在 Swift 3 中一次关闭两个视图控制器。

func dismissTwoViews() {
    self.presentingViewController?
        .presentingViewController?.dismiss(animated: true, completion: nil)
}

Swift 4+ 版本。只是我们需要弹出特定的视图控制器使用这个扩展

extension UINavigationController {

func popToViewController(ofClass: AnyClass, animated: Bool = true) {
    if let vc = viewControllers.filter({$0.isKind(of: ofClass)}).last {
        popToViewController(vc, animated: animated)
    }
}

func popViewControllers(viewsToPop: Int, animated: Bool = true) {
    if viewControllers.count > viewsToPop {
        let vc = viewControllers[viewControllers.count - viewsToPop - 1]
        popToViewController(vc, animated: animated)
    }
}

}

并在您的视图控制器类中像这样使用

for controller in self.navigationController!.viewControllers as 
    Array {
                  if controller.isKind(of: 
    yourPopControllerName.self) {

   self.navigationController?.isNavigationBarHidden = false
                                _ =  
self.navigationController!.popToViewController(controller, 
 animated: false)
                                    break
                                }
                            }

【讨论】:

  • 嗯,此代码看起来与问题中发布的完全相同。那有什么区别呢?在 Swift2 中它只关闭了一个控制器,而在 Swift3 中它关闭了两个控制器?
  • @Mixaz 我刚刚在 Swift 2.2 + iOS 8.1 (Xcode 7.3) 上进行了测试,问题中的代码已经在运行。因此,差异可能来自更旧的 Swift 版本(非常不可能!)或实际上来自更旧的 iOS 版本(如 8.0 或 7.x)。
【解决方案2】:

为此目的有一个特殊的unwind segue,它旨在回滚到堆栈中的某个视图控制器。

让我们将最顶层的控制器(您从哪里来)称为source,将堆栈中的控制器(您想要回滚到顶部)称为destination。 p>

  1. destination 中创建 IBAction 以在展开 segue 时触发:

    @IBAction func myUnwindAction(segue: UIStoryboardSegue) {}

它可以是空的。

  1. source 控制器中通过从控制器图标拖动退出一个来创建展开 segue,它将找到您在步骤 1 中创建的操作。调用 segue unwind

  2. 现在您可以使用常规代码从代码中发出该 segue

    performSegueWithIdentifier("unwind", sender: nil)

我描述了如何从代码中发出 unwind segue。对于按钮展开 segues 可以直接在 IB 中通过拖动按钮退出图标来创建。

还可以查看此讨论以获取更多信息:How to perform Unwind segue programmatically?

【讨论】:

  • 当我这样做时,我得到一个运行时错误,“Receiver has no segue with identifier”
  • 本教程也可能有帮助:medium.com/@mimicatcodes/…
  • 太棒了,我收到错误 no seg with identifier unwind 但最后我只是将按钮右拖到顶部的出口并删除了我之前在按钮中的执行代码并且工作完美谢谢
  • 很好的答案。但是如何避免在unwind 操作期间被关闭的屏幕闪烁?
  • 这是正确的答案,如果您对任何步骤感到困惑,@Mattk90 的教程链接很容易遵循。
【解决方案3】:

您一次只能关闭一个视图控制器。试试这个

@IBAction func backButtonTapped(sender: AnyObject) {
        self.presentingViewController?.dismissViewControllerAnimated(true, completion: {
            let secondPresentingVC = self.presentingViewController?.presentingViewController;
            secondPresentingVC?.dismissViewControllerAnimated(true, completion: {});
        });
}

【讨论】:

    【解决方案4】:

    斯威夫特 4:

    为 UIViewController 创建了一个扩展,可以根据提供的次数

    在 NavigationController 堆栈中弹出 UIViewController
    extension UIViewController {
    
        func pop(numberOfTimes: Int) {
            guard let navigationController = navigationController else {
                return
            }
            let viewControllers = navigationController.viewControllers
            let index = numberOfTimes + 1
            if viewControllers.count >= index {
                navigationController.popToViewController(viewControllers[viewControllers.count - index], animated: true)
            }
        }
    }
    

    【讨论】:

    • 我认为 pop(numberOfTimes) 在可读性方面似乎具有误导性。 pop(numberOfViewControllers: Int) 怎么样
    猜你喜欢
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2021-06-17
    • 2012-05-19
    • 2020-04-25
    相关资源
    最近更新 更多