0

私はスクロールビューを持っているので、私のアプリが動いている間にコンテンツを頻繁にリロードする必要があります。今すぐ、次のコード行を使用して、サブビューを削除してから再び追加します。UIScrollViewのすべてのサブビューを削除するにはどうすればよいですか?

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

代わりに次のコードを使用する必要がありますか?

scrollView.subviews = nil; 

何らかの理由で、上記のコード行が16回実行されるたびにクラッシュするようです。私はどこかに記憶を漏らしていますか?次のメソッドは、ビューの配列、スクロール(定数)と方向を取ります。

編集:あなたが与えた

- (void)loadViews:(NSArray *)views IntoScroller:(UIScrollView *)scroller withDirection:(NSString *)direction{ 
//Set up the scrollView 

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

if([direction isEqualToString:@"horizontal"]){ 
    scrollView.frame = CGRectMake(0, 0, 1024, 768); 
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * [[NSNumber numberWithUnsignedInt:[views count]] floatValue], scrollView.frame.size.height); 
}else if([direction isEqualToString:@"vertical"]){ 
    scrollView.frame = CGRectMake(0, 0, 1024, 768); 
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width, scrollView.frame.size.height * [[NSNumber numberWithUnsignedInt:[views count]] floatValue]); 
} 

for (int i=0; i<[[NSNumber numberWithUnsignedInt:[views count]] intValue]; i++) { 

    [[[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view] setFrame:scrollView.frame]; 

    if([direction isEqualToString:@"horizontal"]){ 
     [[[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view] setFrame:CGRectMake(i * [[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view].frame.size.width, 0, scrollView.frame.size.width, scrollView.frame.size.height)];//CGRectMake(i * announcementView.view.frame.size.width, -scrollView.frame.origin.x, scrollView.frame.size.width, scrollView.frame.size.height)]; 
    }else if([direction isEqualToString:@"vertical"]){ 
     [[[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view] setFrame:CGRectMake(0, i * [[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view].frame.size.height, scrollView.frame.size.width, scrollView.frame.size.height)]; 
    } 

    [scrollView addSubview:[[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view]]; 
} 

}

答えて

4

最初の例では、UIScrollViewからサブビューを削除する正しい方法です。それによって、それが不可能な新しいサブビューを追加すること、subviewsnilに効果的NILSアウトサブビューを管理するコレクションオブジェクトを設定する

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

。以下は

+0

私はまだメモリか何かをリークしています。どこが間違っていますか? – Moshe

+0

さて、サブビューをリセットするたびに、どうすればいいですか? – Moshe

+0

@Moshe説明したようにメソッドを呼び出すだけです。 'removeFromSuperview:'を呼び出すと、配列自身をリセットすることはできません。それはあなたのために行うべきです。 –

1

スクロールビューからすべてのサブビューを削除するためのコードです:

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

     } 
関連する問題