iPhone:如何从UIScrollView中删除所有对象

iPhone:如何从UIScrollView中删除所有对象,iphone,uiscrollview,subview,Iphone,Uiscrollview,Subview,基本上,我想从UIScrollView中删除所有对象,但我还没有找到解决方案,因为一个简单的“removeAllObjects”命令不起作用。有人知道怎么做吗?最简单的方法: for(UIView *subview in [scrollView subviews]) { [subview removeFromSuperview]; } 更简单的是: [[scrollView subviews] makeObjectsPerformSelector:@selector(removeF

基本上,我想从UIScrollView中删除所有对象,但我还没有找到解决方案,因为一个简单的“removeAllObjects”命令不起作用。有人知道怎么做吗?

最简单的方法:

for(UIView *subview in [scrollView subviews]) {

    [subview removeFromSuperview];

}
更简单的是:

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

在不移除滚动条的情况下,有两种解决方案:

将标记添加到所有子视图中,然后使用这些标记将其删除。 实施:

把这个放在你的班级之上

#define XPScrollViewSubviewStartTag             100
添加对象时

for(NSInteger = 0;i<[viewArray count];i++){
     UIView* view = [viewArray objectAtIndex:i];
     view.tag = XPScrollViewSubviewStartTag + i;
     [scrollView addSubview:view];
}
创建自定义UIView类 当您要删除视图时

for(id view in [scrollView subviews]){
      if(![view isKindOfClass:[CustomView class]])
            continue;

      //not necessary, but just to make things understandable
      CustomView* customView = (CustomView*)view;
      [customView removeFromSuperview];
}

Oritm的解决方案很好,但如果您不想麻烦使用标记,可以手动从scrollview中删除要删除的视图。这将假定您知道要删除哪个视图。例如,我的scrollview只有UILabels,因此当我运行以下操作时:

// This will remove the scrollview but the scrollbars will remain 
for (UIView *subview in [self.detailsExpander.scrollView subviews]) {
    if ([NSStringFromClass([subview class]) isEqualToString:@"UILabel"])
        [subview removeFromSuperview];
}

这将只删除所有标签,但保留滚动条(即图像视图)。注意:如果您想在保留滚动条的同时保留特定的图像视图,这将不起作用。

在元素之间循环时修改数组内容是否安全?我只是想知道…一般来说,这可能不是最佳做法,因此您可能需要设置一个标记为要删除的临时数组:PIt在枚举父对象的子视图集合时删除子视图是绝对安全的。我猜您对
makeObjectsPerformSelector
也有同样的问题,即它在子视图中循环,同时修改数组。这种方法很优雅,很多人都使用它,但是如何解决上面progrmr提到的问题呢?我很确定makeObjectsPerformSelector:在调用每个对象的选择器之前生成一个临时数组。如果没有,正如您所说,它会导致问题。不要删除
ui子视图的所有子视图。它的滚动指示器视图是子视图。您也将删除这些。我建议将内容视图放在自己的容器UIView中。(将其作为ivar保存,以便在添加和删除时轻松访问)
// This will remove the scrollview but the scrollbars will remain 
for (UIView *subview in [self.detailsExpander.scrollView subviews]) {
    if ([NSStringFromClass([subview class]) isEqualToString:@"UILabel"])
        [subview removeFromSuperview];
}