因此,当我尝试使用UIImage的init(named:)来设置可访问性标识符时,尽管我调用的是method_exchangeImplementation,但我的混合方法ftg_imageNamed(named name: String)和init(named:)似乎都调用了我的混合方法: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)
}
}发布于 2019-01-13 12:33:10
在self.UI(named: name)之前,你的声音似乎是"ok“。因此请检查该方法是否存在无限循环问题。
现在,这是一个糟糕的swizzling实现。UIImage.init(named:)返回UIImage的一个实例,而swizzled方法UIImage.ftg_imageNamed(named:)返回Void。原始方法和swizzled方法应该具有相同的参数和返回类型,实现方式可能会有所不同。
你应该考虑一种简单的扩展方法来实现你想要的,而不是混乱。
编辑
extension UIImage {
static func initIncludingAccessibility(named: String) -> UIImage {
let img = UIImage(named: named)
img.setAccessibilityLabel(named)
return img
}
}将其用作
let image = UIImage.initIncludingAccessibility(named: /* your_image_name*/)https://stackoverflow.com/questions/54165727
复制相似问题