2016-11-18 55 views
0

我有一些类和内部类有一些定义的方法。每次调用这些方法时,我都需要执行一组特定的操作。我可以在每个方法中编写一组操作。但我不想搞乱代码。所以我创建了一个辅助类,在那里我将传递一组类和选择器。在混合方法中识别方法名

我已经循环遍历数组,并且使用了swizzling技术并使用helper类中定义的自定义方法交换了每个方法的实现。因此,无论何时上述任何类中的任何方法触发,我都会调用我的自定义调整方法。

但我的问题是我无法区分触发的原始​​方法。基于这些参数将在我上面提到的自定义操作集中发生变化。

我目前的实现是像下面:

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) 

} 

而且currensponding搅和方法是:

func trackMethodInvocation() -> Void { 

} 

所以每当任何的选择阵列中列出的方法被调用时,方法trackMethodInvocation()会触发,但我需要知道trackMethodInvocation()内的原始选择器。

有没有什么办法可以知道哪个是调整方法中的原始方法。

+0

这一切听起来像它将是一个令人费解的维修噩梦。你确定这是必要的吗?顺便说一句,使用'classes.indices'而不是'0 .. Alexander

+0

所以我的主要目的只是一个尝试。我需要添加一些分析工具以添加到项目中以跟踪不同的按钮操作。所以我只是试图找到有什么办法可以避免IBActions中与分析相关的代码,以及识别每个IBAction触发器的方法,以便我可以将分析代码添加到该方法中,并使IBAction与按钮操作相关的代码保持不变。 – Sreekanth

回答

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 { 

} 

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