5

我有一个具有相同 UIView 的许多实例的应用程序。他们是一种像 UITableViewCell 一样重用 UIView 的方法吗?如同:

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

3 回答 3

4

我建议您观看WWDC 的2010 年第104场会议,名为“使用 ScrollViews 设计应用程序”,它解释了重用机制 (IIRC)。

您还可以查看OHGridView我实现此技术的源代码:查看OHGridView.mlayoutSubviews中的第二个方法,我在其中添加了未使用的I called ,然后在需要时从中取出一些。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 回答