【发布时间】:2011-02-05 13:46:51
【问题描述】:
我是从 TableViewCell 派生的。当我查询有关索引路径的表视图时,它返回一个 UITableViewCell。我如何确定这个对象是否是我的自定义类型“CustomCell”之一?
【问题讨论】:
我是从 TableViewCell 派生的。当我查询有关索引路径的表视图时,它返回一个 UITableViewCell。我如何确定这个对象是否是我的自定义类型“CustomCell”之一?
【问题讨论】:
实际上您可以在这里使用两种方法。您可能想要的是isKindOfClass:,但还有另一种方法称为isMemberOfClass:,如果接收者是所提供类的实例,而不是子类的实例,则只会返回YES。
例如,如果DerivedClass 是BaseClass 的子类,那么每个方法的结果如下:
BOOL isKind = [aDerivedInstance isKindOfClass:[BaseClass class]]; // YES
BOOL isMember = [aDerivedInstance isMemberOfClass:[BaseClass class]]; // NO
【讨论】:
在面向对象的设计中,尝试使用实例的类标识是一种代码异味,应该引起注意。你到底想用你的自定义单元做什么?也许有人可以提出更好的方法。
无论如何,依赖接口(Objective-C 中的 @protocol)比依赖类更好,因为它有助于解耦你的设计。使用您需要的相关 API 定义 @protocol 并让您的 CustomCell 实现该协议。然后在您的代码中进行测试:
if([cell conformsToProtocol:@protocol(MyCellProtocol)]) {
//...
}
而不是测试类身份。
如果只需要一个方法,可以使用[cell respondsToSelector:@selector(myMethod)]。
【讨论】:
UITableViewCell 的各种子类的单元格,并且您要求一个带有[tableView cellForRowAtIndexPath:indexPath] 的单元格。该表格视图方法只承诺返回UITableViewCell 的实例,并且知道您是否有该单元格的子类的唯一方法是测试它的类。您可以创建一个协议,但无论如何您都会将大部分自定义单元方法放入其中,从而使事情变得更加冗长而没有明显的好处。
if ([cell isKindOfClass:[CustomCell class]]) {
// ...
}
【讨论】:
if ([cell isKindOfClass:[CustomCell class]]) {
[(CustomCell*)cell customCellMethod];
}
【讨论】: