如何检测超类的实例是否是子类?

时间:2014-08-22 23:10:25

标签: ios objective-c uitableview

我将UITableViewCell向下转换为我创建的自定义子类,然后将其分配给UITableViewCell实例。后来我需要知道是否发生了垮台。基本上我需要知道单元格是否是子类的实例,即使它现在被定义为超类的实例。

isKindOfClass不会做这个伎俩,因为只有当它是该类的实例或从该类继承的类的实例时才会出现这种情况,这两种技术都不是技术上真实的,即使单元格实际上是类的一个实例,但只是检查传入的变量,它是不可能知道的。

如何将子类分配给常规UITableViewCell变量,然后知道它是否是子类的实例?

UITableViewCell *cell;
CustomCellClass *customCell = (CustomCellClass *)[super tableView:tableView cellForRowAtIndexPath:indexPath];
cell = customCell;
//...
if ([cell isKindOfClass:[CustomCellClass class]]) {
    //this is never true but I need to run code here
}
return cell

2 个答案:

答案 0 :(得分:1)

你不能。

您的对象IS在CustomCellClass的继承树(是一个实例)中,或者它是NOT。国家之间没有,也没有办法改变这种状况。

现在,向我们展示您的完整代码会有所帮助,因此我们可以为您提供更好的解释,但这是一次尝试:

现在,继承有规则。一个主要规则是你不能低估'一个东西。你只能' upcast'它。如果您创建了NSObject,则无法进行投射。它变成了UIView。但是,您可以将UIView转换为NSObject。

因此,对于您的代码,您无法将cell转换为CustomCellClass,因为单元格不是以CustomCellClass开头的。非常容易改变,真的!

编辑: 如果tableView:cellForRowAtIndexPath:返回CustomCellClass个对象,则以下内容将起作用。但我并不建议将其视为“沮丧”。"它通常被称为" cast"。

你想要什么:

CustomCellClass *cell = (CustomCellClass *)[super tableView:tableView    cellForRowAtIndexPath:indexPath];

if ([cell isKindOfClass:[CustomCellClass class]]) {
    // This will be true because it was created as a CustomCellClass object.
}
return cell

答案 1 :(得分:0)

如果最终目的是使用仅在子类中可用的函数,则使用:

If([cell respondsToSelector:@selector(mysubclassFunction)] { //这个单元格是一个子类并响应该函数 }