isKindOfClass每次都返回TRUE?

时间:2014-05-13 09:24:35

标签: ios objective-c cocoa-touch if-statement

我有一个名为svCreateTask的scrollView。在这个scrollView中,我按下了按钮UITextFieldUITextViewUIButtons静态和UIView编程。现在我想在按下按钮时删除选定的UIView。和视图从scrollView中移除,其标记与Button标记相同。

if语句检查每个时间为TRUE,因此其标签与我的按钮标签相同的其他子视图也会从scrollView中删除。我只想删除UIView

我在这里发布我的代码:

 NSLog(@"Enter in removeNotification method.");

    UIButton *btn = (UIButton *)sender;
    NSLog(@"btn Tag = %d",[btn tag]);

    NSArray *viewsToRemove = [svCreateTask subviews];

    for (int i=0; i<viewsToRemove.count; i++)
    {
        NSLog(@"Class == %@",[[viewsToRemove objectAtIndex:i] class]);
        if ([[viewsToRemove objectAtIndex:i]isKindOfClass:[UIView class]])
        {
            NSLog(@"In Class Check...");
            UIView *v =[viewsToRemove objectAtIndex:i];
            if (v.tag == btn.tag)
            {
                [v removeFromSuperview];
            }
        }

    }

我的NSLog是。

2014-05-13 14:49:42.769 TOPDesign[379:11303] Enter in removeNotification method.
2014-05-13 14:49:42.770 TOPDesign[379:11303] btn Tag = 1
2014-05-13 14:49:42.771 TOPDesign[379:11303] Class == UILabel
2014-05-13 14:49:42.772 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.773 TOPDesign[379:11303] Class == UITextView
2014-05-13 14:49:42.773 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.774 TOPDesign[379:11303] Class == UITextField
2014-05-13 14:49:42.775 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.775 TOPDesign[379:11303] Class == UIButton
2014-05-13 14:49:42.776 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.777 TOPDesign[379:11303] Class == UIButton
2014-05-13 14:49:42.777 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.778 TOPDesign[379:11303] Class == UIButton
2014-05-13 14:49:42.779 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.780 TOPDesign[379:11303] Class == UIButton
2014-05-13 14:49:42.780 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.781 TOPDesign[379:11303] Class == UIButton
2014-05-13 14:49:42.782 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.782 TOPDesign[379:11303] Class == UIButton
2014-05-13 14:49:42.783 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.783 TOPDesign[379:11303] Class == UILabel
2014-05-13 14:49:42.784 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.784 TOPDesign[379:11303] Class == UILabel
2014-05-13 14:49:42.785 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.786 TOPDesign[379:11303] Class == UIImageView
2014-05-13 14:49:42.786 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.787 TOPDesign[379:11303] Class == UIImageView
2014-05-13 14:49:42.787 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.788 TOPDesign[379:11303] Class == UIImageView
2014-05-13 14:49:42.788 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.789 TOPDesign[379:11303] Class == UIImageView
2014-05-13 14:49:42.789 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.790 TOPDesign[379:11303] Class == UIImageView
2014-05-13 14:49:42.799 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.801 TOPDesign[379:11303] Class == UIView
2014-05-13 14:49:42.801 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.802 TOPDesign[379:11303] Class == UIView
2014-05-13 14:49:42.802 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.803 TOPDesign[379:11303] Class == UIImageView
2014-05-13 14:49:42.803 TOPDesign[379:11303] In Class Check...
2014-05-13 14:49:42.804 TOPDesign[379:11303] Class == UIView
2014-05-13 14:49:42.805 TOPDesign[379:11303] In Class Check...

我的屏幕结构是。

UIView(main view) > ScrollView > TextField,TextView,Label, Buttons, UIView Etc.

我想获得UIView哪个是我scrollView的子视图。

4 个答案:

答案 0 :(得分:5)

对于任何派生类,

isKindOfClass都返回true。因为所有与用户界面相关的类都派生自UIView,所以此方法对您案例中的所有对象都返回true。

如果您只想测试UIView类:

,请使用此类代码
if ([obj class] == [UIView class]) {
}

此代码仅检查UIView类型的对象。

答案 1 :(得分:3)

您想要的是使用方法isMemberOfClass:。 (查看Apple文档中的isMemberOfClass方法)

  

isMemberOfClass: - 返回一个布尔值,指示接收者是否是给定类的实例。 (所需的)

然后(查看Apple文档中的isKindOfClass:方法)

  

isKindOfClass: - 返回一个布尔值,指示接收者是给定类的实例还是从该类继承的任何类的实例。 (所需的)

所以基本上当你进行isKindOfClass:检查时,它会为TRUE的任何子类返回UIView,因此这包括UIButtonUILabel

所以将if ([[viewsToRemove objectAtIndex:i]isKindOfClass:[UIView class]])更改为if ([[viewsToRemove objectAtIndex:i] isMemberOfClass:[UIView class]])

UILabel的继承示例如UILabel&gt;&gt; UIView&gt;&gt; UIResponder&gt;&gt; NSObject。因此,当您执行isKindOfClass:[UIView class]时,TRUE会返回UILabel,因为您可以看到UILabelUIView的子类,但如果我们isMemberOfClass:[UIView class] UILabel我们忽略任何子类化对象,例如FALSE,因此这将为UILabel返回TRUE,但仍会为UIView返回UIVeiws

另一种解决方案是在创建viewWithTag:时为他们提供标记,因此在删除标记时,您只需使用{{1}}获取要删除的特定视图即可。

答案 2 :(得分:2)

你遇到的问题是视图层次结构中的每个东西都是以UIView作为它的基类,所以你每次都得到True。处理此问题的一种可能解决方案如下:

给你的UIView提供一些特殊标签,好像通常你给标签为3,然后你可以将它的标签乘以1000,现在得到True,你可以计算出如果UIView包含三个0,然后删除它保留它:))

答案 3 :(得分:1)

这是另一种方式。

UIView *v;
for (int i=0; i<viewsToRemove.count; i++)
{
    v = [viewsToRemove objectAtIndex:i]
    if ([NSStringFromClass([v class]) isEqualToString:@"UIView"])
    {
        //Remove view
    }
}

在其他答案中,我认为使用大力水手提到的isMemberOfClass是正确的方法。