[英]how to remove subviews from 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];
}
要从任何视图中删除所有子视图,可以遍历子视图并向每个子视图发送removeFromSuperview
调用:
// With some valid UIView *view:
for(UIView *subview in [view subviews]) {
[subview removeFromSuperview];
}
但是,这完全是无条件的,它将摆脱给定视图中的所有子视图。 如果您想要更细粒度的内容,则可以采用以下几种不同方法之一:
removeFromSuperview
消息 removeFromSuperview
if
语句,检查类是否相等。 例如,要仅删除视图中存在的所有UIButton(或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
}
}
一个老问题; 但由于它是Google上的第一款产品,因此我想我还要指出,还有这种方法:
[[myScrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
您不能使用此方法进行isKindOfClass检查,但这仍然是一个不错的解决方案。
编辑:需要注意的另一点是,滚动视图的滚动条已作为子视图添加到该滚动视图。 因此,如果您遍历滚动视图的所有子视图,就会遇到它。 如果将其删除,它将再次添加自身-但是,如果仅希望自己的UIView子类在其中,请务必了解这一点。
Swift 3的修订
myScrollView.subviews.forEach { $0.removeFromSuperview() }
除了Tim所说的,我注意到您正在标记您的观点。 如果要删除带有特定标签的视图,可以使用:
[[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];
UIScrollView和UIView的其他子类的问题在于,它们最初包含一些视图(例如UIScrollView的垂直和水平滚动条)。 因此,我创建了UIView的类别,以删除在类中过滤的Subview。
例如:
[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];
}
这确实会导致崩溃,因为基本规则是在枚举数组时不应修改数组,以防止我们可以使用
[[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(UIView *subview in [scrollView subviews]) {
[subview removeFromSuperview];
}
for(subview) in self.scrollView.subviews {
subview.removeFromSuperview()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.