我有一个名为svCreateTask的scrollView
。在这个scrollView
中,我按下了按钮UITextField
,UITextView
,UIButtons
静态和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
的子视图。
答案 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
,因此这包括UIButton
,UILabel
等
所以将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
,因为您可以看到UILabel
是UIView
的子类,但如果我们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
是正确的方法。