[英]someConstant?.isKindOfClass(SomeClassType) always evaluates to true
[英]isKindOfClass returns TRUE every time?
我有一个scrollView
命名svCreateTask。 在这个scrollView
我将UITextField
, UITextView
, UIButtons
静态地和以编程方式将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
,因此包括UIButton
, UILabel
等
因此,将if ([[viewsToRemove objectAtIndex:i]isKindOfClass:[UIView class]])
更改为if ([[viewsToRemove objectAtIndex:i] isMemberOfClass:[UIView class]])
UILabel
的继承示例如UILabel
>> UIView
>> UIResponder
>> NSObject
。 所以,当你做isKindOfClass:[UIView class]
这将返回TRUE
为UILabel
因为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.