[myView isKindOfClass:[UIView class]]给出了奇怪的结果

Fah*_*kar 0 objective-c uitableview uiview ios

我有UITableViewCell,我在其中添加一个UIView内部,我将子视图添加为UIButton,UIImageView.

现在我想访问UIView willDisplayCell.为此我在下面.

NSArray *subviews;
subviews = cell.subviews;

int xxyyzz = 1;
for(id aView in subviews) {
    NSLog(@"aView====%@" , [UIView class]);
    if([aView isKindOfClass:[UIView class]]) {
        NSLog(@"This is UIView... Do what you want to do...");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行时,我将This is UIView... Do what you want to do...获得所有子视图(即UIButton,UIImageView等).aView====UIView

我相信这是因为,UIView是所有对象的超类.

有没有办法我只能访问我在里面的UIView UITableViewCell...

And*_*rea 6

我没有完全解决你的问题,但可能在使用该方法时存在误解-isKindOfClass.特别是应对方法是类和subclassess, UIButton,UITableView等都是子类UIView这样的方法按预期工作,这里的文档:

返回一个布尔值,指示接收者是给定类的实例还是从该类继承的任何类的实例.

最有可能你想要使用-isMemberOfClass它只考虑对象是特定类的实例.
如果要检查的对象来自类集群,例如NSArray引用Apple文档,则还必须使用该方法注意:

在类集群表示的对象上使用此方法时要小心.由于类集群的性质,您获得的对象可能并不总是您期望的类型.如果调用返回类集群的方法,则该方法返回的确切类型是您可以对该对象执行的操作的最佳指示.例如,如果方法返回指向NSArray对象的指针,则不应使用此方法来查看该数组是否可变,如以下代码所示:

// DO NOT DO THIS! if ([myArray isKindOfClass:[NSMutableArray class]])
{
    // Modify the object 
} 
Run Code Online (Sandbox Code Playgroud)

如果在代码中使用此类构造,您可能认为修改实际上不应修改的对象是可以的.这样做可能会为期望对象保持不变的其他代码产生问题.

如果接收者是一个类对象,如果aClass是相同类型的Class对象,则此方法返回YES,否则返回NO.