UITableViewCell 没有正确重用?

Posted

技术标签:

【中文标题】UITableViewCell 没有正确重用?【英文标题】:UITableViewCell is not reuse properly? 【发布时间】:2014-10-27 09:02:26 【问题描述】:

我尝试按如下方式重用 UITableViewCell: 1) 通过 UITableViewCell 使用 xib 文件创建子类。

@interface BaseCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel *labelTitle;
@end

2) 在 IB 中添加重用标识符

3) 添加带有 UITableView 的 UIViewController。

@interface BaseTableViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@end

4) 在 vi​​ewDidLoad 寄存器单元笔尖

[self.tableView registerNib:[UINib nibWithNibName:@"BaseCell" bundle:nil] forCellReuseIdentifier:@"BaseCell"];

5) 并使用 dequeueReusableCellWithIdentifier

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    BaseCell* cell = [tableView dequeueReusableCellWithIdentifier:@"BaseCell"];
    NSAssert(cell, @"cell registered but not created");
    DLog(@"cell:[%p]", cell);

    cell.labelTitle.text = self.showItems[indexPath.row];
    return cell;

之后我看到每次都创建单元格而不是第一次。 我的日志例如:

[0x7f87c9c84740:1] -[BaseCell initWithCoder:] BaseCell
[0x7f87c9c84740:1] -[BaseCell awakeFromNib] reuseIdentifier:BaseCell;
[0x7f87c9d3d230:1] -[BaseTableViewController tableView:cellForRowAtIndexPath:] cell:[0x7f87c9c84740]
[0x7f87c9e29560:1] -[BaseCell initWithCoder:] BaseCell
[0x7f87c9e29560:1] -[BaseCell awakeFromNib] reuseIdentifier:BaseCell;
[0x7f87c9d3d230:1] -[BaseTableViewController tableView:cellForRowAtIndexPath:] cell:[0x7f87c9e29560]
[0x7f87c9e2d150:1] -[BaseCell initWithCoder:] BaseCell

我做错了什么? 如何正确地重复使用单元格。 我使用最新的 Xcode (6.0.1) 我创建了示例 project 来测试它。

【问题讨论】:

【参考方案1】:

只有当单元格在滚动时离开屏幕(或由于某些其他原因而“未使用” - 例如 reloadCells 调用)时,单元格重用的好处才会变得明显。消失的单元格被放入队列中。当 tableView 下一次需要一个单元格时,它会使用队列中的单元格,而不是从 NIB 中构造一个新单元格。

【讨论】:

你是对的。我忘记了重用的概念。它适用于重新加载,但不适用于创建。谢谢。 是的,tableView 将创建和使用尽可能多的单个单元格,因为它需要随时显示。只有当一个单元格被滚动出可见区域时,它才能被重新使用。

以上是关于UITableViewCell 没有正确重用?的主要内容,如果未能解决你的问题,请参考以下文章

我的 UITableViewCell 正在重用以前的单元格 UIImage

自定义 UITableViewCell 显示不正确的值

如何在 Storyboard 控制器中重用定义为原型单元的自定义 UITableViewCell

UITableViewCell 重用和图像重新渲染

来自笔尖的自定义 UiTableViewCell 没有重用?

UITableViewCell 可重用性问题。修改一个单元格正在影响其他单元格