0

我有一个显示项目的 MasterViewController。选择一个项目 (ItemA),在 DetailViewController 中显示 ItemA 的图像。DeutilViewController 包含一个滚动视图,显示所有图像。

当调用 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 图像的滚动视图一样。我试过了

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

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

4

1 回答 1

3

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

所以你不能调用removeFromSuperviewscrollView本身,而是调用它的每个子视图。

当你这样做时要小心,因为你的子视图数组(由返回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 next 将导致@[B,D]......我不知道这是否是您的问题的原因,这会让您错过一些子视图,但如果您这样做,它可能会解释为什么它没有

于 2012-09-22T15:41:55.643 回答