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

#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