如何在没有奇怪动画的情况下关闭2个模态视图控制器

时间:2019-01-19 10:25:08

标签: ios swift

我重新创建了这个问题,并更精确地描述了它的本质。

我在Swift 4上以模态展示了两个视图控制器,没有情节提要(不能使用展开功能),并且没有导航控制器

A presents B which presents C.

之所以不使用navigation controller,是因为我们从底部到顶部制作了简单的动画,而不是从右至左破坏了标准动画 ,我们决定使用present

我想解雇2个视图控制器,并从C转到A。

请仔细阅读我的问题之前,请勿将此问题标记为重复。我发现了类似的帖子,但是都没有解决我的问题。其中一些是Objective-C,或者是建议使用的一些

self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)

或:

self.presentingViewController?.dismiss(animated: false, completion: nil)
self.presentingViewController?.dismiss(animated: true, completion: nil)

这是可行的,但是会产生怪异的动画。只是删除C并为B设置动画效果:

enter image description here

预期结果:

enter image description here

4 个答案:

答案 0 :(得分:3)

想法:您需要关闭带有动画的第三个控制器,并且在关闭后需要关闭没有动画的第二个控制器。解雇第三个控制器时,第二个控制器不可见。


首先,在演示时将第二个视图控制器的 Presentation style 设置为Over Current Context(因为在关闭第三个控制器时我们需要隐藏其view

let vc2 = VC2()
vc2.modalPresentationStyle = .overCurrentContext
present(vc2, animated: true)

继续在第三个控制器中为willDismissdidDismiss创建回调属性。解雇第三个控制器前后,将调用此回调

class VC3: UIViewController {

    var willDismiss: (() -> Void)?
    var didDismiss:  (() -> Void)?

    @IBAction func dismissButtonPressed(_ sender: UIButton) {

        willDismiss?()

        dismiss(animated: true) {
            self.didDismiss?()
        }
    }

}

然后在提供第三个视图控制器的位置的第二个视图控制器中,设置第三个控制器的回调属性:声明关闭第三个控制器时会发生的情况:您需要隐藏第二个视图,然后在关闭第三个控制器后需要关闭第二个视图没有动画(view可以保持隐藏状态,因为视图控制器将被取消初始化)

class VC2: UIViewController {

    @objc func buttonPressed(_ sender: UIButton) {

        var vc3 = VC3()

        vc3.willDismiss = {
            self.view.isHidden = true
        }

        vc3.didDismiss = {
            self.dismiss(animated: false)
        }

        present(vc3, animated: true)
    }

}

enter image description here


无论如何,第二种选择是使用UINavigationController,然后只需调用其方法popToViewController(_:animated:)

答案 1 :(得分:0)

如果您不使用导航控制器,并且想要关闭所有ViewController以显示根ViewController,则(假设A是根)

self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)

答案 2 :(得分:0)

在按钮操作方法中使用此方法。 当您关闭父VC时,当前VC将被关闭。 这将在单个动画中关闭两个VC。

self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)

答案 3 :(得分:0)

从当前可见的视图创建快照,并将其作为子视图添加到显示的第一个视图控制器中。要发现您可以简单地“循环遍历”呈现的视图控制器并从最初的视图控制器中退出:

@IBAction func dismissViewControllers(_ sender: UIButton) {
    var initialPresentingViewController = self.presentingViewController
    while let previousPresentingViewController = initialPresentingViewController?.presentingViewController {
        initialPresentingViewController = previousPresentingViewController
    }


    if let snapshot = view.snapshotView(afterScreenUpdates: true) {
        initialPresentingViewController?.presentedViewController?.view.addSubview(snapshot)
    }

    initialPresentingViewController?.dismiss(animated: true)
}

这是启用慢速动画以将其解雇的结果: https://www.dropbox.com/s/tjkthftuo9kqhsg/result.mov?dl=0