11@_spi ( package ) import NavigationTransition
2+ import RuntimeAssociation
3+ import RuntimeSwizzling
24import UIKit
35
46extension AnyNavigationTransition {
@@ -115,21 +117,16 @@ extension RandomAccessCollection where Index == Int {
115117 }
116118}
117119
118- extension UINavigationController {
119- private static var defaultDelegateKey = " defaultDelegate "
120- private static var customDelegateKey = " customDelegate "
121-
120+ extension UINavigationController : RuntimeAssociation {
122121 private var defaultDelegate : UINavigationControllerDelegate ! {
123- get { objc_getAssociatedObject ( self , & Self . defaultDelegateKey ) as? UINavigationControllerDelegate }
124- set { objc_setAssociatedObject ( self , & Self . defaultDelegateKey , newValue, . OBJC_ASSOCIATION_RETAIN_NONATOMIC ) }
122+ get { self [ ] }
123+ set { self [ ] = newValue }
125124 }
126125
127126 var customDelegate : NavigationTransitionDelegate ! {
128- get {
129- objc_getAssociatedObject ( self , & Self. customDelegateKey) as? NavigationTransitionDelegate
130- }
127+ get { self [ ] }
131128 set {
132- objc_setAssociatedObject ( self , & Self . customDelegateKey , newValue, . OBJC_ASSOCIATION_RETAIN_NONATOMIC )
129+ self [ ] = newValue
133130 delegate = newValue
134131 }
135132 }
@@ -138,6 +135,13 @@ extension UINavigationController {
138135 _ transition: AnyNavigationTransition ,
139136 interactivity: AnyNavigationTransition . Interactivity = . default
140137 ) {
138+ // fix for https://stackoverflow.com/q/73753796/1922543
139+ swizzle (
140+ UINavigationController . self,
141+ #selector( UINavigationController . popToViewController) ,
142+ #selector( UINavigationController . popToViewController_forceAnimated)
143+ )
144+
141145 if defaultDelegate == nil {
142146 defaultDelegate = delegate
143147 }
@@ -201,42 +205,41 @@ extension UINavigationController {
201205 }
202206}
203207
208+ extension UINavigationController {
209+ @objc func popToViewController_forceAnimated( _ viewController: UIViewController , animated: Bool ) -> [ UIViewController ] ? {
210+ // TODO: `if #unavailable(iOS 17?...)` when fixed by Apple
211+ popToViewController_forceAnimated ( viewController, animated: true )
212+ }
213+ }
214+
204215@available ( tvOS, unavailable)
205216extension UINavigationController {
206217 var defaultEdgePanRecognizer : UIScreenEdgePanGestureRecognizer ! {
207218 interactivePopGestureRecognizer as? UIScreenEdgePanGestureRecognizer
208219 }
209220
210- private static var defaultInteractivePanGestureRecognizer = " defaultInteractivePanGestureRecognizer "
211- private static var interactiveEdgePanGestureRecognizer = " interactiveEdgePanGestureRecognizer "
212- private static var interactivePanGestureRecognizer = " interactivePanGestureRecognizer "
213-
214221 var defaultPanRecognizer : UIPanGestureRecognizer ! {
215- get { objc_getAssociatedObject ( self , & Self . defaultInteractivePanGestureRecognizer ) as? UIPanGestureRecognizer }
216- set { objc_setAssociatedObject ( self , & Self . defaultInteractivePanGestureRecognizer , newValue, . OBJC_ASSOCIATION_RETAIN_NONATOMIC ) }
222+ get { self [ ] }
223+ set { self [ ] = newValue }
217224 }
218225
219226 var edgePanRecognizer : UIScreenEdgePanGestureRecognizer ! {
220- get { objc_getAssociatedObject ( self , & Self . interactiveEdgePanGestureRecognizer ) as? UIScreenEdgePanGestureRecognizer }
221- set { objc_setAssociatedObject ( self , & Self . interactiveEdgePanGestureRecognizer , newValue, . OBJC_ASSOCIATION_RETAIN_NONATOMIC ) }
227+ get { self [ ] }
228+ set { self [ ] = newValue }
222229 }
223230
224231 var panRecognizer : UIPanGestureRecognizer ! {
225- get { objc_getAssociatedObject ( self , & Self . interactivePanGestureRecognizer ) as? UIPanGestureRecognizer }
226- set { objc_setAssociatedObject ( self , & Self . interactivePanGestureRecognizer , newValue, . OBJC_ASSOCIATION_RETAIN_NONATOMIC ) }
232+ get { self [ ] }
233+ set { self [ ] = newValue }
227234 }
228235}
229236
230237@available ( tvOS, unavailable)
231- extension UIGestureRecognizer {
232- private static var strongDelegateKey = " strongDelegateKey "
233-
238+ extension UIGestureRecognizer : RuntimeAssociation {
234239 var strongDelegate : UIGestureRecognizerDelegate ? {
235- get {
236- objc_getAssociatedObject ( self , & Self. strongDelegateKey) as? UIGestureRecognizerDelegate
237- }
240+ get { self [ ] }
238241 set {
239- objc_setAssociatedObject ( self , & Self . strongDelegateKey , newValue, . OBJC_ASSOCIATION_RETAIN_NONATOMIC )
242+ self [ ] = newValue
240243 delegate = newValue
241244 }
242245 }
0 commit comments