如何检测 TableViewCell 是否被重用或创建

How to detect if TableViewCell has been reused or created

在使用 dequeueReusableCell API 的 Swift 中,我们无法控制 TableViewCell 的新实例的创建。但是,如果我需要将一些初始参数传递给我的自定义单元格怎么办?出队后设置参数将需要检查它们是否已经设置并且看起来比 Objective-C 中更难看,在 Objective-C 中可以为单元格创建自定义初始化程序。

这是我的意思的代码示例。

Objective-C, assuming that I don't register a class for the specified identifier:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* reuseIdentifier = @"MyReuseIdentifier";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (!cell)
    {
        cell = [[MyTableViewCell alloc] initWithCustomParameters:...]; // pass my parameters here

    }
    return cell;
}

Swift:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyReuseIdentifier")
    if let cell = cell as? MyTableViewCell {
       // set my initial parameters here
       if (cell.customProperty == nil) {
           cell.customProperty = customValue
       }
    }
}

我是不是漏掉了什么,或者它在 Swift 中应该如何工作?

在 swift 或 objective-c dequeueReusableCell 中 return 如果有可用的单元格 1 或如果没有则创建另一个单元格,顺便说一句在 objc 中可以在 swift 中完成它是相同的

总是在 UITVCells 将在您的 Cell 中重用之前 class 将 prepareForReuse() 调用。您可以使用此方法重置所有内容,如 imageView.image = nil

使用 UITVCell init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) 的首字母来了解单元格是否已创建。

如果您想知道 tableView class 中的这些信息,请使用 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 委托方法。

PS:别忘了打电话给super.

工作方法与Objective-C基本相同:不要为"MyReuseIdentifier"注册单元并使用dequeueReusableCell(withIdentifier:)

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "MyReuseIdentifier")
    if cell == nil {
        cell = MyTableViewCell.initWithCustomParameters(...)
    }
    return cell
}