2015-10-27 70 views
0

我使用属性isKindOfClass比较两个类,但似乎没有工作。我记录了似乎相同的输出,但我不明白他们为什么不工作。两个类别的比较

UIView *childView = [view subviews][j-1]; 
NSLog(@"childview class: %@", childView.class); 
NSLog(@"childview.class class: %@", [childView.class class]); 
NSLog(@"sfidimmer button class: %@", [SFIDimmerButton class]); 


if([childView.class isKindOfClass:[SFIDimmerButton class]]){ 
    NSLog(@"iskindofclass"); 
    curFrameSize = dimFrameWidth; 
} 

输出nslogs的:

childview class: SFIDimmerButton 

childview.class class: SFIDimmerButton 

sfidimmer button class: SFIDimmerButton 

控制不进去,如果conditon,可以请你让我知道为什么吗?

回答

4

不要使用类做这样的..

if([childView isKindOfClass:[SFIDimmerButton class]]){ 

    // do your stuff here .. 
} 

希望它能帮助你。

+1

谢谢,但你能解释当我使用课堂时发生了什么吗? – Masood

+0

@Moodood这应该会帮助你找出原因:http://stackoverflow.com/a/3653947/656600也可以看看leo的答案以获得更多细节。 – rptwsthi

1

你的支票是错的。你应该调用isKindOfClass:on对象而不是对象的类。

因此,而不是检查

if([childView.class isKindOfClass:[SFIDimmerButton class]]){ 
    NSLog(@"iskindofclass"); 
    curFrameSize = dimFrameWidth; 
} 

试试这个

if([childView isKindOfClass:[SFIDimmerButton class]]){ 
    NSLog(@"iskindofclass"); 
    curFrameSize = dimFrameWidth; 
} 

您还可以使用isMemberOfClass,但大部分要使用isKindOfClass时间:确保你的代码也可以与子类。

isKindOfClass:如果接收方是指定类的实例或从指定类继承的任何类的实例,则返回YES。

isMemberOfClass:如果接收方是指定类的实例,则返回YES。

2

你的错误

Self.class返回类对象,而你使用isKindOfClass这是用来检查类的实例

您可以检查一个对象是使用isKindOfClass如上回答说的那个类的实例。

文献

返回一个布尔值,指示接收器是否是给定的类的一个实例或从该类继承的任何类的一个实例。

也可以使用

[childView.class isSubclassOfClass:[SFIDimmerButton class]] 

检查类返回一个布尔值,指示接收等级是否是的一个子类,或等同于,一个给定的类。

0

使用id数据类型的任何对象,然后将它与Class类型进行比较。如果满意,则用Target类型键入cast。

id childView = [view subviews][j-1]; 
if ([childView isKindOfClass:[SFIDimmerButton class]]) { 

    SFIDimmerButton *btnDimmer = (SFIDimmerButton *)childView; 
    // perform your action with derived button.. 
} 

希望它能帮助你。
谢谢。