【问题标题】:What's a good way to remove all of the subviews of a UIScrollView?删除 UIScrollView 的所有子视图的好方法是什么?
【发布时间】:2010-11-28 03:29:49
【问题描述】:

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

[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]];
}

}

【问题讨论】:

    标签: iphone objective-c cocoa-touch memory-management uiscrollview


    【解决方案1】:

    您给出的第一个示例是从UIScrollView 中删除子视图的正确方法。

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

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

    【讨论】:

    • 我还在泄漏内存什么的。我哪里出错了?
    • 好的,那么每次我想重置子视图时,我该怎么做呢?
    • @Moshe 只需调用您描述的方法,仅此而已。你不能重置数组本身,当你调用removeFromSuperview:它应该为你做。
    • @Jacb - 谢谢,不过我不确定这里发生了什么。
    • 也只是一个快速的简化说明——“[[NSNumber numberWithInt:i] unsignedIntValue] 是重言式——你可以直接说“i”。[views objectAtIndex:i] 也可以!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-07
      • 2011-05-05
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      相关资源
      最近更新 更多