我重新创建了这个问题,并更精确地描述了它的本质。
我在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设置动画效果:
预期结果:
答案 0 :(得分:3)
想法:您需要关闭带有动画的第三个控制器,并且在关闭后需要关闭没有动画的第二个控制器。解雇第三个控制器时,第二个控制器不可见。
首先,在演示时将第二个视图控制器的 Presentation style 设置为Over Current Context
(因为在关闭第三个控制器时我们需要隐藏其view
)
let vc2 = VC2()
vc2.modalPresentationStyle = .overCurrentContext
present(vc2, animated: true)
继续在第三个控制器中为willDismiss
和didDismiss
创建回调属性。解雇第三个控制器前后,将调用此回调
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)
}
}
无论如何,第二种选择是使用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