Skip to content

Commit 5a6e870

Browse files
committed
[Change] save options in rootVC, and save semiModalViewController and semiModalDismissBlock in targetVC
1 parent 421c823 commit 5a6e870

2 files changed

Lines changed: 24 additions & 11 deletions

File tree

Source/UIViewController+Options.swift

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,24 @@ extension UIViewController {
1818
}
1919

2020
func registerOptions(_ options: [SemiModalOption: Any]?) {
21-
objc_setAssociatedObject(self, &CustomOptions, options, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
21+
// options always save in parent viewController
22+
var targetVC: UIViewController = self
23+
while targetVC.parent != nil {
24+
targetVC = targetVC.parent!
25+
}
26+
27+
objc_setAssociatedObject(targetVC, &CustomOptions, options, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
2228
}
2329

2430
func optionForKey(_ optionKey: SemiModalOption) -> Any? {
25-
guard let options = objc_getAssociatedObject(self, &CustomOptions) as? [SemiModalOption: Any]
31+
var targetVC: UIViewController = self
32+
while targetVC.parent != nil {
33+
targetVC = targetVC.parent!
34+
}
35+
36+
guard let options = objc_getAssociatedObject(targetVC, &CustomOptions) as? [SemiModalOption: Any]
2637
, let value = options[optionKey] else {
27-
return defaultOptions[optionKey]
38+
return defaultOptions[optionKey]
2839
}
2940

3041
switch optionKey {

Source/UIViewController+SemiModalViewController.swift

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ extension UIViewController {
4545
targetParentVC.addChildViewController(vc)
4646
vc.beginAppearanceTransition(true, animated: true)
4747

48-
objc_setAssociatedObject(self, &semiModalViewController, vc, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
49-
objc_setAssociatedObject(self, &semiModalDismissBlock, ClosureWrapper(closure: dismissBlock), .OBJC_ASSOCIATION_COPY_NONATOMIC)
48+
objc_setAssociatedObject(targetParentVC, &semiModalViewController, vc, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
49+
objc_setAssociatedObject(targetParentVC, &semiModalDismissBlock, ClosureWrapper(closure: dismissBlock), .OBJC_ASSOCIATION_COPY_NONATOMIC)
5050

5151
presentSemiView(vc.view, options: options) {
5252
vc.didMove(toParentViewController: targetParentVC)
@@ -177,15 +177,17 @@ extension UIViewController {
177177
}
178178

179179
public func dismissSemiModalViewWithCompletion(_ completion: (() -> Void)?) {
180-
let targetView = parentTargetView()
181-
guard let modal = targetView.viewWithTag(semiModalModalViewTag)
180+
let targetVC = parentTargetViewController()
181+
182+
guard let targetView = targetVC.view
183+
, let modal = targetView.viewWithTag(semiModalModalViewTag)
182184
, let overlay = targetView.viewWithTag(semiModalOverlayTag)
183185
, let transitionStyle = optionForKey(.transitionStyle) as? SemiModalTransitionStyle
184186
, let duration = optionForKey(.animationDuration) as? TimeInterval else { return }
185187

186188

187-
let vc = objc_getAssociatedObject(self, &semiModalViewController) as? UIViewController
188-
let dismissBlock = (objc_getAssociatedObject(self, &semiModalDismissBlock) as? ClosureWrapper)?.closure
189+
let vc = objc_getAssociatedObject(targetVC, &semiModalViewController) as? UIViewController
190+
let dismissBlock = (objc_getAssociatedObject(targetVC, &semiModalDismissBlock) as? ClosureWrapper)?.closure
189191

190192
vc?.willMove(toParentViewController: nil)
191193
vc?.beginAppearanceTransition(false, animated: true)
@@ -210,8 +212,8 @@ extension UIViewController {
210212

211213
dismissBlock?()
212214

213-
objc_setAssociatedObject(self, &semiModalDismissBlock, nil, .OBJC_ASSOCIATION_COPY_NONATOMIC)
214-
objc_setAssociatedObject(self, &semiModalViewController, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
215+
objc_setAssociatedObject(targetVC, &semiModalDismissBlock, nil, .OBJC_ASSOCIATION_COPY_NONATOMIC)
216+
objc_setAssociatedObject(targetVC, &semiModalViewController, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
215217

216218
NotificationCenter.default.removeObserver(self, name: .UIDeviceOrientationDidChange, object: nil)
217219
})

0 commit comments

Comments
 (0)