我正在尝试对我正在处理的项目进行一些调试,并且想知道正在分配特定变量的ViewController的类型。所以我创建了一个if语句:
if ([controller isSubclassOfClass:[UINavigationController class]]) {
NSLog(@"It's a navigation controller!");
}
'控制器'使用
创建DetailViewController *controller = (DetailViewController *)[[segue destinationViewController]topViewController];
DetailViewController是一个继承自UIViewController的简单类。但是我收到编译错误No visibile @interface for 'DetailViewController' declares the selector 'isSubclassOfClass:'
怎么可能?当我对isSubclassOfClass的引用进行tripleTap时,它说它是NSObject中定义的类方法。由于所有对象都是从NSObject继承的,所以DetailViewController怎么可能不知道那个选择器?
答案 0 :(得分:3)
执行此操作的标准方法是-isKindOfClass:
,而不是+isSubclassOfClass:
,但可以使用+isSubclassOfClass:
。
使用实例方法-isKindOfClass:
if ([controller isKindOfClass:[UINavigationController class]]) {
NSLog(@"It's a navigation controller!");
}
使用类方法+isSubclassOfClass:
if ([[controller class] isSubclassOfClass:[UINavigationController class]]) {
NSLog(@"It's a navigation controller!");
}
答案 1 :(得分:3)
其他两位回复者都对你的问题给出了正确答案,但我想澄清一些事情。
声明以+开头的方法是CLASS方法。类对象实现那些方法,而不是该类的实例。所以这个方法:
+ (BOOL)isSubclassOfClass:(Class)aClass
是一种类方法。
你会像Jeffery Thomas在答案的第一部分中所说的那样使用它:
[[controller class] isSubclassOfClass:[UINavigationController class]]
[controller class]
位获取控制器对象的类对象,然后将该类对象发送给isSubclassOfClass消息。
相反,方法isKindOfClass:
- (BOOL)isKindOfClass:(Class)aClass
...是一个实例方法。你可以说,因为它的声明以“ - ”而不是“+”开头。学习在每个方法声明的开头查找“+”或“ - ”,以查看它是类方法还是实例方法。如果编译器不允许您发送文档中显示的消息,请返回并仔细检查。我已经在Objective-C编程了好几年了,这偶尔会让我感到厌烦。
您将isKindOfClass
消息发送到要为类成员身份测试的对象的实例:
[controller isKindOfClass:[UINavigationController class]]
答案 2 :(得分:2)
当我对isSubclassOfClass的引用进行tripleTap时,它表示它是NSObject中定义的类方法。
这是一个类方法,你在一个实例上使用它。试试isKindOfClass
。