@@ -9,36 +9,62 @@ import UIKit
99
1010extension UIViewController {
1111 var isGettingDismissed : Bool {
12- isBeingDismissed ||
13- isMovingFromParent ||
14- navigationController? . isBeingDismissed == true ||
15- isUnderlyingViewControllerBeingDismissed ( of : self )
12+ return isBeingDismissed
13+ || isMovingFromParent
14+ || navigationController? . isBeingDismissed == true
15+ || checkUnderlyingDismissal ( )
1616 }
1717
18- private func isUnderlyingViewControllerBeingDismissed( of viewController: UIViewController ? ) -> Bool {
19- let presentingViewController = viewController? . presentingViewController
20- let presentedViewController = viewController? . presentedViewController
18+ private func checkUnderlyingDismissal( ) -> Bool {
19+ var visited = Set < ObjectIdentifier > ( )
20+ return isUnderlyingViewControllerBeingDismissed ( of: self , visited: & visited)
21+ }
22+
23+ private func isUnderlyingViewControllerBeingDismissed(
24+ of viewController: UIViewController ? ,
25+ visited: inout Set < ObjectIdentifier >
26+ ) -> Bool {
27+ guard let vc = viewController else { return false }
28+ let id = ObjectIdentifier ( vc)
29+ guard !visited. contains ( id) else { return false }
30+ visited. insert ( id)
2131
22- if presentingViewController == nil && presentedViewController == nil {
23- return false
32+ if isParentDismissed ( vc , visited : & visited ) {
33+ return true
2434 }
2535
26- if presentingViewController == nil {
27- if presentedViewController? . isBeingDismissed == true {
28- return true
29- }
36+ return isChildDismissed ( vc, visited: & visited)
37+ }
38+
39+ private func isParentDismissed(
40+ _ vc: UIViewController ,
41+ visited: inout Set < ObjectIdentifier >
42+ ) -> Bool {
43+ guard let presenting = vc. presentingViewController else { return false }
3044
31- return isUnderlyingViewControllerBeingDismissed ( of: presentedViewController)
45+ if presenting. isBeingDismissed {
46+ return true
3247 }
3348
34- if presentedViewController == nil {
35- if presentingViewController? . isBeingDismissed == true {
36- return true
37- }
49+ return isUnderlyingViewControllerBeingDismissed (
50+ of: presenting,
51+ visited: & visited
52+ )
53+ }
54+
55+ private func isChildDismissed(
56+ _ vc: UIViewController ,
57+ visited: inout Set < ObjectIdentifier >
58+ ) -> Bool {
59+ guard let presented = vc. presentedViewController else { return false }
3860
39- return isUnderlyingViewControllerBeingDismissed ( of: presentingViewController)
61+ if presented. isBeingDismissed {
62+ return true
4063 }
4164
42- return isUnderlyingViewControllerBeingDismissed ( of: presentingViewController) || isUnderlyingViewControllerBeingDismissed ( of: presentedViewController)
65+ return isUnderlyingViewControllerBeingDismissed (
66+ of: presented,
67+ visited: & visited
68+ )
4369 }
4470}
0 commit comments