我有很多类,内部类有很多方法定义。我需要在调用每个方法时执行一组特定的操作。我可以在每个方法中编写一组操作。但我不想搞砸代码。所以我创建了一个帮助器类,我将传递一组Classes和Selectors。
我已遍历数组并使用了调配技术,并使用helper类中定义的自定义方法交换了每个方法的实现。因此,无论何时触发上述任何类中的任何方法,我都会调用我的自定义swizzling方法。
但我的问题是我无法区分触发的原始方法。基于此,一些参数将在我上面提到的自定义操作集中发生变化。
我目前的实施情况如下:
for i in 0..<classes.count {
let eachClass:AnyClass = classes[i] as AnyClass
let eachSelector:Selector = selectors[i] as Selector
let swizzilableClass = MyHelper.self
let originalMethod = class_getInstanceMethod(eachClass, eachSelector)
let swizzledMethod = class_getInstanceMethod(swizzilableClass, #selector(MyHelper.trackMethodInvocation))
method_exchangeImplementations(originalMethod, swizzledMethod)
}
最近的混合方法是:
func trackMethodInvocation() -> Void {
}
因此,只要调用selectors数组中列出的任何方法,方法trackMethodInvocation()
就会触发,但我需要知道trackMethodInvocation()
中的原始选择器。
有没有办法知道哪个是混合方法中的原始方法。
答案 0 :(得分:1)
在某种程度上,我找到了另一种解决方案。请注意*在进行实时实施之前,我会确保安全。不再有循环了。我将要做的是,我将使用我的自定义方法调整UIApplication的sendAction方法。在我的自定义方法中,我将执行我的操作并将调用原始的sendAction方法。所以代码现在看起来如下,
let originalClass:AnyClass = UIApplication.self
let swizzilableClass = MyHelper.self
let originalMethod = class_getInstanceMethod(originalClass, #selector(UIApplication.sendAction(_:to:from:for:)))
let swizzledMethod = class_getInstanceMethod(swizzilableClass, #selector(MyHelper.trackMethodInvocation(_:to:from:for:)))
method_exchangeImplementations(originalMethod, swizzledMethod)
我的混合方法看起来像,
func trackMethodInvocation(_ action: Selector, to target: Any?, from sender: Any?, for event: UIEvent?) -> Void {
}
所以在这里我会得到选择器。所以任何尝试这个的人,***请确保UHEpplication方法的安全性。确保在swizzled方法中调用原始方法。目前我这样做仅用于研究目的。