代码之家  ›  专栏  ›  技术社区  ›  Moshe

删除UIScrollView的所有子视图的好方法是什么?

  •  0
  • Moshe  · 技术社区  · 14 年前

    我有一个滚动视图,我需要在我的应用程序运行时经常重新加载内容。现在,我正在使用以下代码行删除子视图,然后再重新添加它们:

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

    我应该用下面的代替吗?

    scrollView.subviews = nil;
    

    出于某种原因,上面(第一行)的代码似乎每运行16次应用程序就会崩溃一次。我是不是在某个地方泄露了记忆?以下方法获取视图数组、滚动条(它是一个常量)和方向。

    编辑:

    - (void)loadViews:(NSArray *)views IntoScroller:(UIScrollView *)scroller withDirection:(NSString *)direction{
    //Set up the scrollView
    
    [scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    
    if([direction isEqualToString:@"horizontal"]){
        scrollView.frame = CGRectMake(0, 0, 1024, 768);
        scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * [[NSNumber numberWithUnsignedInt:[views count]] floatValue], scrollView.frame.size.height);
    }else if([direction isEqualToString:@"vertical"]){
        scrollView.frame = CGRectMake(0, 0, 1024, 768);
        scrollView.contentSize = CGSizeMake(scrollView.frame.size.width, scrollView.frame.size.height * [[NSNumber numberWithUnsignedInt:[views count]] floatValue]);
    }
    
    for (int i=0; i<[[NSNumber numberWithUnsignedInt:[views count]] intValue]; i++) {
    
        [[[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view] setFrame:scrollView.frame];
    
        if([direction isEqualToString:@"horizontal"]){
            [[[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view] setFrame:CGRectMake(i * [[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view].frame.size.width, 0, scrollView.frame.size.width, scrollView.frame.size.height)];//CGRectMake(i * announcementView.view.frame.size.width, -scrollView.frame.origin.x, scrollView.frame.size.width, scrollView.frame.size.height)];
        }else if([direction isEqualToString:@"vertical"]){
            [[[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view] setFrame:CGRectMake(0, i * [[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view].frame.size.height, scrollView.frame.size.width, scrollView.frame.size.height)];
        }
    
        [scrollView addSubview:[[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view]];
    }
    

    }

    2 回复  |  直到 13 年前
        1
  •  4
  •   Jacob Relkin    14 年前

    您给出的第一个示例是从 UIScrollView .

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

    设置 subviews nil 有效地消除了管理子视图的集合对象,因此无法添加新的子视图。

        2
  •  1
  •   Moshe    14 年前

    下面是从滚动视图中删除所有子视图的代码:

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