【问题标题】:How to reuse UIView like UITableViewCell如何像 UITableViewCell 一样重用 UIView
【发布时间】:2012-09-14 17:40:03
【问题描述】:

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

【问题讨论】:

  • 您是否使用 Storyboard,这可能与答案不同...
  • @lehn0058 你应该看看这个 Let's Build UITableView mikeash.com/pyblog/…

标签: ios uitableview uiview reusability


【解决方案1】:

这个简单的代码演示了基本池,如果视图不在任何层次结构中,则该池将其出列。对于复杂的用例,您应该需要标识符、锁、...

看看我的要点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;
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这适用于存储视图,但它们只有 3 种类型,多次使用。我想知道更多关于如何重用视图,所以我不需要重建它们。
    【解决方案3】:

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

    您还可以查看OHGridView 的来源,我在其中实现了此技术:查看OHGridView.m 中的第二个layoutSubviews 方法,我在NSMutableSet 中添加了未使用的UIViews,我称之为recyclePool ,然后在我需要时从这个recyclePool 中取出一些UIViews

    【讨论】:

    • 我想这就是我要找的。所以 NSMutableSet 是这里的关键。如果我将 UIView 的不同实例添加到集合中,那么从中检索 UIView 将为我提供对未修改视图的引用。我想我很困惑,因为我一直认为从集合中请求相同的对象然后修改该对象会修改集合中的对象。所以你的意思是事实并非如此,对吗?
    • 当然是这样。您将在集合中或集合之外操作相同的对象,这将是相同的引用。如果你修改它,集合中的那个也会被修改,因为这是同一个对象。 但是这正是UITableView 和它们的单元格的工作方式:当您调用dequeueReusableCellWithIdentifier: 时,您会得到一个之前已经使用过的UITableViewCell,并且在您上次使用时仍然会影响到它的值用过。这就是为什么每次将单元格出列以覆盖之前的值时,您都会重置所有值(textLabel.text 等)。
    • 其实我不确定你想在这里实现什么,如果你使用正确的词汇:你真的想重用一个视图,以便它有时是可见的在屏幕上,然后消失,但是您稍后需要此视图将其显示在其他地方等,所以当您将其从原始视图中删除时,您将把它放在一边,稍后再选择它以在不同的视图上显示它?或者您是否想要每次都具有相同外观的视图的多个实例,并同时使用所有实例?这意味着您需要创建多个看起来相同的视图才能同时显示
    • 对不起,如果我不是很清楚。我想像表格视图一样使用它,在每一行中都有相同类型的单元格,但即使我使用 100 行都包含不同的数据,也只需要分配一次对象。我认为 NSMutableSet 是我想要的,但我只是看不到 UI 将如何在引用同一个对象时更改它们时显示正确的值。这几乎就像我需要渲染它然后更改值......
    • 嗯,这与 UITableView 的工作方式完全相同:如果最多说 6 个单元格始终可见,它将分配 6 个不同的单元格,因此您将拥有 6 个不同的实例(而不仅仅是一个,以防不清楚)。每当一个单元格超出范围并从屏幕上消失时,它就会从其父视图(也称为 tableview)中删除并放入 tableview 的“回收池”中。每次您需要一个单元格时,您首先询问 tableview 在其“回收池”中是否有一个单元格。 […]
    猜你喜欢
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2019-12-12
    • 1970-01-01
    相关资源
    最近更新 更多