2010-04-08 52 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 
相关问题