You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.7 KiB
41 lines
1.7 KiB
#if canImport(UIKit)
|
|
import UIKit
|
|
|
|
extension UIStoryboard {
|
|
static func swizzling() {
|
|
DispatchQueue.once(token: "swinject.storyboard.init") {
|
|
let aClass: AnyClass = object_getClass(self)!
|
|
|
|
let originalSelector = #selector(UIStoryboard.init(name:bundle:))
|
|
let swizzledSelector = #selector(swinject_init(name:bundle:))
|
|
|
|
let originalMethod = class_getInstanceMethod(aClass, originalSelector)!
|
|
let swizzledMethod = class_getInstanceMethod(aClass, swizzledSelector)!
|
|
|
|
let didAddMethod = class_addMethod(aClass, originalSelector,
|
|
method_getImplementation(swizzledMethod),
|
|
method_getTypeEncoding(swizzledMethod))
|
|
|
|
guard didAddMethod else {
|
|
method_exchangeImplementations(originalMethod, swizzledMethod)
|
|
return
|
|
}
|
|
class_replaceMethod(aClass, swizzledSelector,
|
|
method_getImplementation(originalMethod),
|
|
method_getTypeEncoding(originalMethod))
|
|
}
|
|
}
|
|
|
|
@objc class func swinject_init(name: String, bundle: Bundle?) -> UIStoryboard {
|
|
guard self == UIStoryboard.self else {
|
|
return self.swinject_init(name: name, bundle: bundle)
|
|
}
|
|
// Instantiate SwinjectStoryboard if UIStoryboard is trying to be instantiated.
|
|
if SwinjectStoryboard.isCreatingStoryboardReference {
|
|
return SwinjectStoryboard.createReferenced(name: name, bundle: bundle)
|
|
} else {
|
|
return SwinjectStoryboard.create(name: name, bundle: bundle)
|
|
}
|
|
}
|
|
}
|
|
#endif
|