我有一个显示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];
}
导致根本没有滚动视图,或者没有效果。取决于何时调用此方法。 如何“重置”下一个项目的滚动视图?
答案 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]
...
我不知道这是否是你问题的原因,这会让你错过一些子视图,但如果你这样做,它可能会解释为什么它不能正常工作。