Я пробовал решения unwind segues и dismiss nested presentingViewController, но у обоих все еще есть проблема, когда промежуточный контроллер виден во время анимации.
Тогда я нашел это suggestion, который я изменил с помощью создания нескольких снимков, поскольку он не работал должным образом для меня.
Возможно, это не лучшее решение, но все же может быть полезно.
расширения Helper:
extension UIViewController {
func dismissModalStack(animated: Bool, completion: (()->Void)?) {
guard let snapshot = UIApplication.shared.delegate?.window??.snapshotView() else { return }
self.presentedViewController?.view.insertSubview(snapshot, at: Int.max)
self.dismiss(animated: true, completion: completion)
}
}
extension UIView {
public func snapshotImage() -> UIImage? {
UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0)
drawHierarchy(in: bounds, afterScreenUpdates: false)
let snapshotImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return snapshotImage
}
public func snapshotView() -> UIView? {
guard let snapshotImage = snapshotImage() else { return nil }
return UIImageView(image: snapshotImage)
}
}
Использование:
В последнем представленном контроллере представления:
@IBAction func dismissPressed() {
self.presentingViewController?.presentingViewController?.dismissModalStack(animated: true, completion: nil)
}
Результат:
И какой контроллер вы хотите отображать вместо OldViewController? – alexburtnik
A -> B (представленный над A) -> C (представлен по модулю над B), и вы хотите вернуться с C на A, правильно? – alexburtnik
Я только что отредактировал сообщение, чтобы дать представление о иерархии viewcontroller. – EvanOgo