2016-11-18 20 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方法的安全性。確保在調整方法中調用原始方法。目前我只是爲了研究目的而這樣做。