如何检测 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
}
在使用 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
}