繁体   English   中英

如何从滚动视图中删除子视图?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM