繁体   English   中英

每次isKindOfClass返回TRUE吗?

[英]isKindOfClass returns TRUE every time?

我有一个scrollView命名svCreateTask。 在这个scrollView我将UITextFieldUITextViewUIButtons静态地和以编程方式将UIView放在按钮按下时。 现在,我想在按下按钮时删除Selected UIView 并且该视图从scrollView移除,其标签与Button标签相同。

并且if语句每次Time 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的子视图。

isKindOfClass对于任何派生类也返回true。 由于所有与用户界面相关的类均从UIView派生,因此此方法对您所用的所有对象均返回true。

如果您只想测试UIView类,请使用如下代码:

if ([obj class] == [UIView class]) {
}

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

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

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

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

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

因此,基本上,当您执行isKindOfClass:检查它是否对UIView任何子类返回TRUE ,因此包括UIButtonUILabel

因此,将if ([[viewsToRemove objectAtIndex:i]isKindOfClass:[UIView class]])更改为if ([[viewsToRemove objectAtIndex:i] isMemberOfClass:[UIView class]])

UILabel的继承示例如UILabel >> UIView >> UIResponder >> NSObject 所以,当你做isKindOfClass:[UIView class]这将返回TRUEUILabel因为UILabel ,你可以看到的是一个子类UIView ,但如果我们这样做isMemberOfClass:[UIView class]我们忽略像任何子类对象UILabel ,所以这将返回FALSE对于UILabel但对于UIView仍返回TRUE

另一种解决方案是在创建UIVeiws给它们添加标签,因此要删除它们,您只需使用viewWithTag:即可获取要删除的特定视图。

您的问题在于,视图层次结构中的所有内容都将UIView作为其基类,因此您每次都获得True。 解决此问题的一种可能的解决方案如下:

给您的UIView一些特殊的标签,就像通常您给标签提供3一样,然后您可以将其标签乘以1000,现在得到True,就可以计算出一个UIView包含三个0,然后删除它,否则保持它:)

这是另一种方式。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM