如何“重置”新项目的scrollview子视图?

时间:2012-09-22 15:35:41

标签: iphone xcode uiscrollview subview

我有一个显示Items的MasterViewController。选择项目(ItemA),在DetailViewController中显示ItemA的图像。 DeatilViewController包含一个scrollView,显示所有图像。

当调用tableView:didSelectRowAtIndexPath时,图像被添加到UIImageView,该标记被标记并作为子视图添加到滚动视图中。

NSUInteger i;
for (i = 1; i <= numberOfImages; i++)
{
     NSString *imageName = [ItemAImages objectAtIndex:i-1];
     UIImage *image = [UIImage imageNamed:imageName];
     UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
     imageView.tag = i; 
     [scrollView addSubview:imageView];
}

工作正常。但是当我回到MasterViewController并选择一个ItemB时,仍会显示ItemA,就像iPhone模拟器拒绝忘记包含ItemA图像的前一个scrollview一样。我试过了

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

导致根本没有滚动视图,或者没有效果。取决于何时调用此方法。 如何“重置”下一个项目的滚动视图?

1 个答案:

答案 0 :(得分:3)

您必须删除滚动视图的每个子视图。

因此,您必须在removeFromSuperview本身而不是每个子视图上调用scrollView

当你这样做时要小心,因为你的子视图数组(由scrollview.subviews返回)会在你通过它迭代并删除子视图时发生变化。因此,最好复制一下这个子视图列表并迭代该副本:

NSArray* subviews = [scrollview.subviews copy];
for(UIView* v in subviews)
{
    [v removeFromSuperview];
}
[subviews release];

注意:始终避免修改要迭代的集合。另外,因为您可能会在枚举中跳过某些对象。例如,如果你有一个数组@[A,B,C,D,E]并迭代内容以删除对象,你的代码可能会说“删除索引0处的对象,然后是索引1处的对象,然后是索引2处的对象......”。但是一旦你在索引0处删除了对象,集合就会变成@[B,C,D,E],索引1处的数组将是C,而不是你将跳过的B。一旦你删除索引1处的对象,您的收藏将变为@[B,D,E],并且在索引2处删除对象将导致@[B,D] ... 我不知道这是否是你问题的原因,这会让你错过一些子视图,但如果你这样做,它可能会解释为什么它不能正常工作。