2014-02-09 88 views
2

我在我的應用程序中有許多UITableViewController子類。如何使用方法swizzle或子類

現在我只需要修改它們全部在所有情況下添加+1行,並在所有情況下添加一行簡單的相等行。

我不想手動修改所有的人,更好的辦法似乎對替代UITableViewDataSource方法類似的方法來修改值:

+(void)load { 
[[self class] jr_swizzleMethod:@selector(tableView:numberOfRowsInSection:) withMethod:@selector(swizzledTableView:numberOfRowsInSection:) error:nil]; 
} 

- (NSInteger)swizzledTableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
return [self swizzledTableView:tableView numberOfRowsInSection:section] + 1; 
} 

但它取代超功能,不會在子類中調用,所以這是行不通的。有沒有辦法做到我想要的,而不修改所有的子類?

回答

2

你需要特別調配每個子類。你可以在運行時用類似於objc_getClassList的類來檢索它,但我無法描述這種方法有多危險和脆弱。你試圖將這個應用於系統中的每個tableview,你希望這只是你所說的tableviews(即你的tableviews)。但是可能由系統或第三方庫使用的tableviews呢?你也在修改它們。而當你試圖瞭解這個原因引起的崩潰時,由於混合,堆棧跟蹤將無法理解。

爲了達到這個目的,tableView:cellForRowAtIndexPath:也需要正確處理這個額外的行,所以很難看出系統中的每個表視圖控制器如何在不知道這個+1的情況下正確實現。

要麼是你的表視圖控制器的子類(並讓他們調用super),要麼使用一個單獨的對象,如果需要它們都調用它們來添加額外的行。這另一個對象(或超類)也是你應該處理這個額外行的單元格的地方。

+0

+1。我從來沒有想過方法混合的子類方法,這讓我非常好奇。你可以舉幾個代碼示例來說明如何做到這一點?對不起,因爲我不是原來的海報。但我只是很好奇。提前致謝。 – Unheilig

+0

我懷疑你會在隨時可用的代碼中找到樣本。正如我所指出的那樣,這是一種危險而脆弱的做法。但是我所描述的是調用'objc_getClassList',然後使用-isKindOfClass:遍歷層次結構尋找所需類的子類,然後修改它們。 (但請注意:以後可能會添加類,並且不會收到通知。)如果您需要這樣瘋狂的事情,更好的方法就是KVO所做的事情,即每個對象(而不是每個類)的ISA混搭:https ://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOImplementation.html –

0

您將進入兩個需要完全理解才能正確使用並且非常危險的區域:在+ load方法中執行代碼並使用方法調整。我永遠不會在+負載中做任何事情。如果你知道自己在做什麼,+初始化是可以的,但如果你在這裏提問,+加載是你甚至不能想到的東西。

現在問問自己:什麼是「自我」在班級方法中,什麼是「[自我班級]」?你認爲這甚至有工作的機會嗎?

我還建議你谷歌的「swizzle」,並拿起一些其他代碼的方法swizzling。它對我來說看起來很可疑。把它寫成一個類而不是一個普通的C函數,感覺非常糟糕。

+4

提出問題是你如何學習。你應該試着解釋推理,而不是說它感覺太糟糕了。 –

+0

-1用於判斷無效答案 – OzBoz

1

我幾乎沒有什麼經驗。但我有兩個可能的解決方案來解決您的問題。

第一張: 創建一個子類:YouBaseTableView:UITableView,並在YouBaseTableView中添加一行。並從YouBaseTableView繼承所有的表視圖類。

第二個: 爲UITableView創建一個擴展,並在此擴展中寫下你的行。

0

我可能是遲到的火車...... 但是爲了將來的參考,解決這個問題的方法是調整UITableView的setDataSource並將其替換爲NSProxy實例。 通常沒有人會重寫setDelegate/setDataSource方法,並且允許您調整這些方法並攔截對這些委託的所有調用並交換實現。

檢查了這一點的詳細信息:https://developer.apple.com/documentation/foundation/nsproxy

相關問題