5

同じUIViewのインスタンスが多数あるアプリがあります。UITableViewCellでできるようにUIViewを再利用する方法はありますか?に似ている:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
4

3 に答える 3

4

再利用メカニズム(IIRC)について説明している「ScrollViewsを使用したアプリの設計」と呼ばれるWWDCの2010年のセッション104をご覧になることをお勧めします。

OHGridViewまた、この手法を実装したソースを確認することもできます。OHGridView.mlayoutSubviewsの2番目のメソッドを確認します。ここでは、と呼ばれるIで未使用を追加し、必要に応じてこれからいくつかをデキューします。UIViewsNSMutableSetrecyclePoolUIViewsrecyclePool

于 2012-09-22T15:56:04.107 に答える
0

NSCacheを使用して、キャッシュする必要のあるUIViewインスタンスをキャッシュすることをお勧めします。NSCacheは、値を取得するためにキーをコピーせず、メモリを処理するための優れたメカニズムを可能にするという点でNSDictionaryとは異なります。ドキュメントをチェックして、それがあなたのために働くかどうか確かめてください。最近、これを使用してUIPinAnnotationViewオブジェクトをキャッシュしました。

于 2012-09-22T16:13:50.843 に答える
0

この単純なコードは、ビューが階層にない場合にビューをデキューする基本的なプールを示しています。複雑なユースケースの場合、識別子、ロック、...が必要です。

私の要点FTGViewPoolを見てください

@interface FTGViewPool ()

@property (nonatomic, strong) NSMutableArray *views;
@property (nonatomic, assign) Class viewClass;

@end

@implementation FTGViewPool

- (instancetype)initWithViewClass:(Class)kClass {
    self = [super init];
    if (self) {
        _views = [NSMutableArray array];
        _viewClass = kClass;
    }

    return self;
}

- (UIView *)dequeueView {
    // Find the first view that is not in any hierarchy
    for (UIView *view in self.views) {
        if (!view.superview) {
            return view;
        }
    }

    // Else create new view
    UIView *view = [[self.viewClass alloc] init];
    [self.views addObject:view];
    return view;
}
于 2014-12-29T15:12:55.633 に答える