Подключите это к игровой площадке и возитесь с ней:
import UIKit
protocol DismissDelegate: AnyObject {
func dismissVC(_ presenting: Int)
}
class VC1: UIViewController, DismissDelegate {
func dismissVC(_ presenting: Int) {
guard presenting == 1 else {
return
}
print("dismiss 2, 3, 4, 5")
}
}
class VC2: UIViewController, DismissDelegate {
weak var vc2Delegate: DismissDelegate?
func dismissVC(_ presenting: Int) {
guard presenting == 2 else {
return vc2Delegate!.dismissVC(presenting)
}
print("dismiss 3, 4, 5")
}
}
class VC3: UIViewController, DismissDelegate {
weak var vc3Delegate: DismissDelegate?
func dismissVC(_ presenting: Int) {
guard presenting == 3 else {
return vc3Delegate!.dismissVC(presenting)
}
print("dismiss 4, 5")
}
}
class VC4: UIViewController, DismissDelegate {
weak var vc4Delegate: DismissDelegate?
func dismissVC(_ presenting: Int) {
guard presenting == 4 else {
return vc4Delegate!.dismissVC(presenting)
}
print("dismiss 5")
}
}
class VC5: UIViewController {
weak var vc5Delegate: DismissDelegate?
func dismissStack(at presenting: Int) {
vc5Delegate?.dismissVC(presenting)
}
}
let vc1 = VC1()
let vc2 = VC2()
vc2.vc2Delegate = vc1
let vc3 = VC3()
vc3.vc3Delegate = vc2
let vc4 = VC4()
vc4.vc4Delegate = vc3
let vc5 = VC5()
vc5.vc5Delegate = vc4
vc5.dismissStack(at: 1) // prints: dismiss 2, 3, 4, 5
vc5.dimissStack(at: 2) // prints: dismiss 3, 4, 5
Настройка очень проста, каждый контроллер представления связан через делегата.Поскольку существует более одного контроллера представления, мы создали протокол.Этот протокол является просто методом, который принимает целочисленный аргумент, который является контроллером представления, который должен выполнить dismiss (контроллер представления представления).Затем, когда вы хотите выполнить отклонение, вызовите делегат (не обязательно из 5-го контроллера представления), укажите контроллер представления, и делегат пойдет по цепочке и проверит, является ли он представителем представления (еслиэто так, он отклонит все выше него) или нет (если это не так, он уйдет в отставку на один контроллер представления и повторит процесс).
VC5
имеет метод с именем dismissStack(at:)
, который позволяетвы вводите целое число в контроллере представления, в котором хотите отказаться.Поэтому, если вы отклоните в 2, то просмотр контроллеров 3, 4, 5 будет отклонен.Очевидно, что вы можете поместить этот метод и в другие контроллеры представления.