如何从scrollview中删除子视图?

问题描述:

我如何从我的滚动视图中删除所有子视图...如何从scrollview中删除子视图?

我有一个UIView,并在滚动视图像这样它上面的按钮....

这里是我的代码中添加滚动子视图视图

-(void)AddOneButton:(NSInteger)myButtonTag { 
lastButtonNumber = lastButtonNumber + 1; 

if ((lastButtonNumber == 1) || ((lastButtonNumber%2) == 1)) { 
btnLeft = 8;} 
else if ((lastButtonNumber == 2) || ((lastButtonNumber%2) == 0)) { 
btnLeft = 162; 
} 
CGRect frame1 = CGRectMake(btnLeft, btnTop, 150, 150); 
CGRect frame2 = CGRectMake(btnLeft, btnTop, 150, 150); 
UIButton *Button = [UIButton buttonWithType:UIButtonTypeCustom]; 
Button.frame = frame1; 
Button.tag = myButtonTag; 
[Button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside]; 
[Button setBackgroundColor:[UIColor clearColor]]; 
[Button setBackgroundImage:[UIImage imageNamed:@"WaitScreen.png"] forState:UIControlStateHighlighted]; 

    GraphThumbViewControllerobj = [[GraphThumbViewController alloc] initWithPageNumber:[[GraphIdArray objectAtIndex:myButtonTag]intValue]]; 
    GraphThumbViewControllerobj.view.frame=frame2; 
    GraphThumbViewControllerobj.lblCounter.text=[NSString stringWithFormat:@"%d of %d",myButtonTag+1,flashCardsId.count]; 
    GraphThumbViewControllerobj.lblQuestion.text=[flashCardText objectAtIndex:myButtonTag]; 
    [myScrollView addSubview:GraphThumbViewControllerobj.view]; 


[myScrollView addSubview:Button]; 


if ((lastButtonNumber == 2) || ((lastButtonNumber%2) == 0)) { 
btnTop = btnTop + 162; 
} 
if (btnTop+150 > myScrollView.frame.size.height) { 
myScrollView.contentSize = CGSizeMake((myScrollView.frame.size.width), (btnTop+160));} 
} 

和这里是代码以除去子视图

if(myScrollView!=nil) 
{ 
     while ([myScrollView.subviews count] > 0) { 
      //NSLog(@"subviews Count=%d",[[myScrollView subviews]count]); 
      [[[myScrollView subviews] objectAtIndex:0] removeFromSuperview]; 
} 

alt text http://www.freeimagehosting.net/uploads/e5339a1f51.png

要从任何视图中删除所有的子视图,您可以通过子视图迭代,并互送一个removeFromSuperview电话:

// With some valid UIView *view: 
for(UIView *subview in [view subviews]) { 
    [subview removeFromSuperview]; 
}

这完全是无条件的,虽然,在将摆脱所有子视图给定的观点。如果你想要的东西更细粒度的,你可以采取几种不同的方法:

  • 维护自己的观点不同类型的数组,所以你可以以同样的方式removeFromSuperview邮件发送它们
  • 保留所有您创建视图的位置,并保留指向这些视图的指针,因此您可以根据需要单独发送removeFromSuperview
  • if语句添加到上面的循环中,检查类相等性。例如,仅去除存在于一个视图中的所有UIButtons(或UIButton的自定义子类),你可以使用类似:
// Again, valid UIView *view: 
for(UIView *subview in [view subviews]) { 
    if([subview isKindOfClass:[UIButton class]]) { 
     [subview removeFromSuperview]; 
    } else { 
     // Do nothing - not a UIButton or subclass instance 
    } 
}
+0

这对我有很大的帮助。谢谢! – 2010-07-13 03:38:50

+1

不错的一个伴侣。正是我需要的。 – Critter 2011-04-08 18:19:08

要添加到什么蒂姆说,我注意到,您标记你的意见。如果你想删除某个标签的视图,你可以使用:

[[myScrollView viewWithTag:myButtonTag] removeFromSuperview]; 

我不认为你应该使用快速枚举建议。

for(UIView *subview in [view subviews]) { 
    [subview removeFromSuperview]; 
} 

这难道不应该,如果你改变集合抛出一个异常被迭代? http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocFastEnumeration.html#//apple_ref/doc/uid/TP30001163-CH18-SW3

这个例子可能会更好。

NSArray *subviews = [[scroller subviews] copy]; 
for (UIView *subview in subviews) { 
    [subview removeFromSuperview]; 
} 
[subviews release]; 
+0

完美的作品,谢谢 – 2011-04-12 07:18:32

老问题;但因为它是在谷歌第一主打为了这个,我想我还记有也是这种方法:

[[myScrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

你不能做的isKindOfClass这种检查,但它仍然是一个很好的解决知道关于。

编辑:另一点需要注意的是,scrollview的滚动条作为子视图添加到该滚动视图。因此,如果你迭代scrollview的所有子视图,你会遇到它。如果被移除,它会再次添加自己 - 但如果您只希望自己的UIView子类在那里,那么知道这一点很重要。

修订为夫特3:

myScrollView.subviews.forEach { $0.removeFromSuperview() } 
+0

感谢您的信息。 – 2011-05-26 11:15:16

+0

你拥有ittt !!!!!!!! – 2012-08-19 00:21:19

与的UIView的UIScrollView的和其他亚类的问题是,它们最初包含一些视图(像用于UIScrollView的垂直和水平滚动条)。所以我创建了一个UIView类来删除在这个类上过滤的Subviews。

例如:

[UIScrollView removeAllSubviewsOfClass:[FooView class],[BarView class],nil]; 

代码:

- (void)removeAllSubviewsOfClass:(Class)firstClass, ... NS_REQUIRES_NIL_TERMINATION; 


- (void)removeAllSubviewsOfClass:(Class)firstClass, ... 
{ 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"FALSEPREDICATE"]; 

    va_list args; 
    va_start(args, firstClass); 

    for (Class class = firstClass; class != nil; class = va_arg(args, Class)) 
    { 
     predicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:predicate,[NSPredicate predicateWithFormat:@"self isKindOfClass:%@",class], nil]]; 
    } 

    va_end(args); 
    [[self.subviews filteredArrayUsingPredicate:predicate] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

} 

的最简单有效的办法就是

for(UIView *subview in [scrollView subviews]) { 

    [subview removeFromSuperview]; 

} 

最好的和最简单的就是使用

for(UIView *subview in [scrollView subviews]) 
{ 
    [subview removeFromSuperview]; 
} 

这确实会导致崩溃的基本规则是数组不应该修改而被枚举,以防止我们可以使用

[[scrollView subviews] 
      makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

但有时崩溃将继续出现,因为makeObjectsPerformSelector:将枚举并进行选择,还的iOS 7 UI操作进行优化,以执行除在IOS 6更快,因此,为了反向迭代阵列和除去

NSArray *vs=[scrollView subviews]; 
for(int i=vs.count-1;i>=0;i--) 
{ 
    [((UIView*)[vs objectAtIndex:i]) removeFromSuperview]; 
} 

注意的最佳方式:枚举危害修改,但不进行迭代...

for(subview) in self.scrollView.subviews { 
     subview.removeFromSuperview() 
}