如何像UITableViewCell一样重用UIView

时间:2012-09-22 15:28:29

标签: ios uitableview uiview reusability

我的应用程序包含许多相同UIView的实例。他们是否可以像UITableViewCell一样重用UIView?类似于:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

3 个答案:

答案 0 :(得分:4)

我建议你观看WWDC' 2010 的会话 104 ,称为“使用ScrollViews设计应用程序”,解释了重用机制(IIRC)。

您还可以查看我实施此技术的OHGridView来源:查看OHGridView.m中的第二个layoutSubviews方法,其中我将未使用的UIViews添加到NSMutableSet我致电recyclePool,然后在需要时UIViewsrecyclePool出发。

答案 1 :(得分:0)

我建议使用NSCache缓存需要缓存的UIView实例。 NSCache与NSDictionary不同,因为它不复制密钥以获取值,并且它允许一些良好的机制来处理内存。检查the documentation,看看它是否适合您。我最近使用它来缓存UIPinAnnotationView对象。

答案 2 :(得分: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;
}