我正在使用UIViewControllerTransitioningDelegate
协议在两个视图控制器之间进行很好的转换,其中呈现的视图控制器嵌套在另一个视图控制器中。
现在的问题是,当呈现的视图控制器被关闭时,呈现的视图控制器没有被关闭。
所以我的视图控制器层次结构如下:
VC1
具有一个属性,其中包含对VC2
的引用。 VC2
在某个时候会显示VC3
,它实现了UIViewControllerTransitioningDelegate
。
VC2
引用中有一个didSet
:
var vc2: VC2? {
didSet {
if let vc = vc2 {
anotherController.addChild(vc)
view.setSubview(vc.view, removeSubviews: false)
vc.didMove(toParent: anotherController)
} else if let dismissed = oldValue {
dismissed.willMove(toParent: nil)
view.subviews.forEach { $0.removeFromSuperview() }
dismissed.removeFromParent()
}
}
}
如前所述,VC3
正在实现UIViewControllerTransitioningDelegate
和UIViewControllerAnimatedTransitioning
协议。我对func animateTransition(using transitionContext: UIViewControllerContextTransitioning)
的实现如下所示:
guard let toVC = transitionContext.viewController(forKey: .to) else { return }
let containerView = transitionContext.containerView
if presenting {
containerView.addSubview(toVC.view)
// some animation
} else {
// some reverse animation
}
VC2
以非常标准的方式呼叫VC3
:
let vc = VC3()
self.present(vc, animated: true)
奇怪的是,在此方法中,transitionContext.viewController(forKey: .from)
返回VC1
而不是VC2
,尽管VC2
表示VC3
,因此当{{ 1}}被关闭,VC2
没有被删除。因此,VC3
也将是containerView
的视图,而不是VC1
。
在解除VC2
的情况下,如何确保正确解除VC3
的视图?