0

アイテムを表示するMasterViewControllerがあります。アイテム (ItemA) を選択すると、ItemA の画像が DetailViewController に表示されます。DetilViewController には、すべての画像を表示する 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 を選択すると、iPhone シミュレーターが ItemA の画像を含む以前のスクロールビューを忘れないように、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 の配列は B ではなく C になり、インデックス 1 のオブジェクトを削除すると、コレクションはインデックス 1 のオブジェクトを@[B,D,E]削除するようになります2 次の結果は@[B,D]… それが問題の原因であるかどうかはわかりませんが、それによっていくつかのサブビューが失われます。

于 2012-09-22T15:41:55.643 に答える