如何从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
}
}
要添加到什么蒂姆说,我注意到,您标记你的意见。如果你想删除某个标签的视图,你可以使用:
[[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];
完美的作品,谢谢 – 2011-04-12 07:18:32
老问题;但因为它是在谷歌第一主打为了这个,我想我还记有也是这种方法:
[[myScrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
你不能做的isKindOfClass这种检查,但它仍然是一个很好的解决知道关于。
编辑:另一点需要注意的是,scrollview的滚动条作为子视图添加到该滚动视图。因此,如果你迭代scrollview的所有子视图,你会遇到它。如果被移除,它会再次添加自己 - 但如果您只希望自己的UIView子类在那里,那么知道这一点很重要。
修订为夫特3:
myScrollView.subviews.forEach { $0.removeFromSuperview() }
感谢您的信息。 – 2011-05-26 11:15:16
你拥有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()
}
这对我有很大的帮助。谢谢! – 2010-07-13 03:38:50
不错的一个伴侣。正是我需要的。 – Critter 2011-04-08 18:19:08