0

我有许多类,并且在类内部定义了许多方法。当每个方法被调用时,我需要执行一组特定的操作。我可以在每个方法中编写一组操作。但我不想弄乱代码。所以我创建了一个辅助类,在里面我将传递一组类和选择器。

我已经遍历了数组,并使用了 swizzling 技术,并将每个方法的实现与帮助程序类中定义的自定义方法进行了交换。因此,每当上述任何类中的任何方法被触发时,我都会调用我的自定义 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)

}

而当前的 swizzled 方法是:

func trackMethodInvocation() -> Void {

}

因此,每当调用选择器数组中列出的任何方法时,该方法trackMethodInvocation()都会触发,但我需要知道trackMethodInvocation().

有什么方法可以知道哪个是 swizzled 方法中的原始方法。

4

1 回答 1

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 {

}

所以在这里我会得到选择器。所以任何尝试这个的人,***请确保 swizzling UIApplication 方法的安全性。确保在 swizzled 方法中调用原始方法。目前我这样做只是为了研究目的。

于 2016-11-18T06:14:02.313 回答