【问题标题】:How to use prepareForReuse method如何使用 prepareForReuse 方法
【发布时间】:2012-03-10 21:17:24
【问题描述】:

我发现这个方法叫做- (void)prepareForReuse。我read the document但我不明白如何使用它。

当我滚动我的表格视图时,它卡住了,或者滚动很慢,我打算使用prepareForReuse。谁能指点我一个好的教程或给我一些示例代码以便我学习。

抱歉,我没有任何代码来演示我的工作。

【问题讨论】:

  • 我怀疑prepareForReuse: 会解决你的性能问题...
  • UITableViewCell 再次出现在UITableView 之前,从您可能想要重置的任何内容中清除它。仅当您使用自己的控件编写自己的子类并且永远不应该直接调用它时才需要它。

标签: iphone objective-c


【解决方案1】:

prepareForReuse 方法由当前不需要的单元格上的拥有表视图调用。您应该在此处为您的自定义单元格进行少量清理,例如重置 alpha 值等,以便以后可以重用它。顺便说一句,你不应该自己称呼它。

只有在实现自定义表格视图单元格时才需要关心它:覆盖它以进行清理。

您只是通过在tableView:cellForIndexPath: 中使用重用标识符来“使用”它:

static NSString *CellIdentifier = @"Identifier";

cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:CellIdentifier];
    [cell autorelease];
    // Set up your cell
}

要进一步提高您的表格视图性能,请参阅问题Tricks for improving iPhone UITableView scrolling performance?

【讨论】:

  • “你不应该自己称呼它,顺便说一句。”你为什么这么认为?在 Apple 文档中没有找到任何关于自己调用它的信息。如果我想在单元格刚刚离开屏幕时执行一些额外的清理操作怎么办?
  • @Legonaftik:根本没有必要。表格视图已经在适当的时间调用了该方法,自己调用它是浪费周期。如果您真的必须在单元格不再显示后立即清理资源,您可以考虑覆盖单元格的didMoveToWindow 并检查self.window 是否为nil 以检测屏幕外的视图。
  • 我认为这取决于具体情况。如果您希望此清理行为适用于您重用此 UITableViewCell 子类的每个视图控制器,则可以覆盖单元格的 didMoveToWindow。但是,如果这种清理行为(屏幕外的清理)特定于单个 View Controller,那么最好覆盖 UITableViewDeletetableView:didEndDisplayingCell:forRowAtIndexPath: 方法并在其中调用 cell.prepareForReuse()
  • @Legonaftik:你可以这样做。但我仍然坚持我最初的话:您不应该自己称呼它,因为通常没有必要,如果您这样做,您就是在做不必要的工作。如果您知道自己在做什么,并且您真的需要在单元格离开屏幕后立即进行一些清理,那么您当然可以调用它(或者实现一个名为相反,或执行任何其他适合您特定需求的方案)。
【解决方案2】:

如果您的自定义单元类中有可能修改或不修改单元属性的逻辑,则可以使用它。例如,如果您的表格调用了您的单元格,但在某些情况下它可以修改背景颜色,但在某些情况下它不会并且会使用您设置的默认值,那么您需要实现

-(void)prepareForReuse{
    [super prepareForReuse];

    // Then Reset here back to default values that you want.
}

否则,如果您的逻辑不改变它,它可能会重用您之前设置的值。

【讨论】:

  • 我如何设置它以使被修改的单元格保持修改状态,而将“重用”的其他单元格保持为默认选项?
  • @lukesIvi 你找到解决问题的方法了吗?
猜你喜欢
  • 2017-04-07
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 2019-01-07
相关资源
最近更新 更多