Так что, когда я попытался прокрутить UIImage
init(named:)
, чтобы я мог установить идентификатор доступности с именем изображения, кажется, что, хотя я звоню method_exchangeImplementation
, оба моих извергнутых метода ftg_imageNamed(named name: String)
и init(named:)
вызовите мой метод swizzled: ftg_imageNamed(named name: String)
создание бесконечного цикла. Это почему?
Звонок method_exchangeImplementation
extension UIImage {
static func swizzleInitImplementation() {
let originalSelector = #selector(UIImage.init(named:))
let swizzledSelector = #selector(UIImage.ftg_imageNamed(named:))
let imgSelf: AnyClass = self.classForCoder()
guard let originalMethod = class_getClassMethod(imgSelf, originalSelector),
let swizzledMethod = class_getClassMethod(imgSelf, swizzledSelector) else {
assertionFailure("The methodsw are not found")
return
}
method_exchangeImplementations(originalMethod, swizzledMethod)
}
@objc static func ftg_imageNamed(named name: String) {
setAccessibilityLabel(name)
self.ftg_imageNamed(named: name)
}
}
Ручная реализация, которая не удалась аналогичным образом.
extension UIImage {
static func swizzleInitImplementation() {
let originalSelector = #selector(UIImage.init(named:))
let swizzledSelector = #selector(UIImage.ftg_imageNamed(named:))
let imgSelf: AnyClass = self.classForCoder()
guard let originalMethod = class_getClassMethod(imgSelf, originalSelector),
let swizzledMethod = class_getClassMethod(imgSelf, swizzledSelector) else {
assertionFailure("The methodsw are not found")
return
}
let imp1 = method_getImplementation(originalMethod)
let imp2 = method_getImplementation(swizzledMethod)
method_setImplementation(originalMethod, imp2)
method_setImplementation(swizzledMethod, imp1)
}
@objc static func ftg_imageNamed(named name: String) {
setAccessibilityLabel(name)
self.ftg_imageNamed(named: name)
}
}