2010-04-08 53 views

回答

3
if ([cell isKindOfClass:[CustomCell class]]) { 
    [(CustomCell*)cell customCellMethod]; 
} 
2
if ([cell isKindOfClass:[CustomCell class]]) { 
    // ... 
} 
1

一如往常,在面向對象的設計,嘗試使用實例的階級身份是一個代碼味道,應該提高的標誌。你想要用自定義單元格做什麼?也許有人可以提出更好的方法。

不管怎樣,依賴於接口(Objective-C中的@protocol)的設計要好得多,因爲它有助於解耦您的設計。用您需要的相關API定義@protocol,並讓CustomCell實現該協議。在你的代碼中,你可以測試:

if([cell conformsToProtocol:@protocol(MyCellProtocol)]) { 
    //... 
} 

而不是測試類身份。

如果您只需要一種方法,您可以使用[cell respondsToSelector:@selector(myMethod)]

+1

我認爲用例是在這種情況下,很清楚。特別是用ObjectiveC打字的方式。你有一個表格視圖,裏面填充了'UITableViewCell'各個子類的單元格,並且你要求''tableView cellForRowAtIndexPath:indexPath]'。該table view方法只承諾返回一個'UITableViewCell'的實例,唯一的方法就是知道你是否有該單元的一個子類,以測試它的類。你可以創建一個協議,但是你會把大部分的自定義單元方法放在裏面,使得事情變得更加冗長,看起來沒什麼好處。 – 2010-04-08 16:50:09

0

實際上有兩種方法可以在這裏使用。您可能需要的是isKindOfClass:,但還有另一種方法稱爲isMemberOfClass:,如果接收方是提供的類的實例,而不是子類的實例,則這將只返回YES

例如,如果DerivedClassBaseClass一個子類,那麼這裏的每個方法的結果:

BOOL isKind = [aDerivedInstance isKindOfClass:[BaseClass class]]; // YES 
BOOL isMember = [aDerivedInstance isMemberOfClass:[BaseClass class]]; // NO 
相關問題