@@ -94,22 +94,31 @@ class NavigationHierarchyController {
94
94
navigationController. present ( alert, animated: proposal. animated)
95
95
}
96
96
}
97
+
98
+ private var isInModalContext : Bool {
99
+ navigationController. presentedViewController != nil
100
+ && !modalNavigationController. isBeingDismissed
101
+ }
97
102
98
103
private func navigate( with controller: UIViewController , via proposal: VisitProposal ) {
99
104
switch proposal. context {
100
105
case . default:
101
106
if let visitable = controller as? Visitable {
102
107
delegate. visit ( visitable, on: . main, with: proposal. options)
103
108
}
109
+ let willReplaceModalContext = isInModalContext
104
110
navigationController. dismiss ( animated: proposal. animated)
105
- pushOrReplace ( on: navigationController, with: controller, via: proposal)
111
+ pushOrReplace ( on: navigationController,
112
+ with: controller,
113
+ via: proposal,
114
+ didReplaceModalContext: willReplaceModalContext)
106
115
case . modal:
107
116
if let visitable = controller as? Visitable {
108
117
delegate. visit ( visitable, on: . modal, with: proposal. options)
109
118
}
110
119
controller. configureModalBehaviour ( with: proposal)
111
120
112
- if navigationController . presentedViewController != nil , !modalNavigationController . isBeingDismissed {
121
+ if isInModalContext {
113
122
pushOrReplace ( on: modalNavigationController, with: controller, via: proposal)
114
123
} else {
115
124
modalNavigationController. setViewControllers ( [ controller] , animated: proposal. animated)
@@ -119,12 +128,16 @@ class NavigationHierarchyController {
119
128
}
120
129
}
121
130
122
- private func pushOrReplace( on navigationController: UINavigationController , with controller: UIViewController , via proposal: VisitProposal ) {
131
+ private func pushOrReplace( on navigationController: UINavigationController ,
132
+ with controller: UIViewController ,
133
+ via proposal: VisitProposal ,
134
+ didReplaceModalContext: Bool = false ) {
135
+
123
136
if visitingSamePage ( on: navigationController, with: controller, via: proposal. url) {
124
137
navigationController. replaceLastViewController ( with: controller)
125
138
} else if visitingPreviousPage ( on: navigationController, with: controller, via: proposal. url) {
126
139
navigationController. popViewController ( animated: proposal. animated)
127
- } else if proposal. options. action == . advance {
140
+ } else if proposal. options. action == . advance || didReplaceModalContext {
128
141
navigationController. pushViewController ( controller, animated: proposal. animated)
129
142
} else {
130
143
navigationController. replaceLastViewController ( with: controller)
0 commit comments