Я использую протокол 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
, таким образом, когда VC2
отклоняется, VC3
не удален. Таким образом, containerView
будет также VC1
вместо VC2
.
Как мне убедиться, что вид VC3
корректно отклоняется, когда VC2
отклоняется?