在混合方法中识别方法名称

时间:2016-11-18 04:36:36

标签: ios swift method-swizzling

我有很多类,内部类有很多方法定义。我需要在调用每个方法时执行一组特定的操作。我可以在每个方法中编写一组操作。但我不想搞砸代码。所以我创建了一个帮助器类,我将传递一组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()中的原始选择器。

有没有办法知道哪个是混合方法中的原始方法。

1 个答案:

答案 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方法中调用原始方法。目前我这样做仅用于研究目的。