我在UITableView
中出现了可重复使用的单元格功能。 tableview有几个单元格,每个单元格都包含一个按钮。
当我滚动时,将重新创建单元格,并且新按钮开始与旧按钮重叠(直到我在同一单元格中有一堆相同的按钮)。我听说你应该使用removeFromSuperview
函数来解决这个问题,但我不确定该怎么做。
这是我的应用的图片:
这是cellForRowAtIndexPath
(问题发生的地方)
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath)
let nameLabel: UILabel = {
let label = UILabel()
label.text = "Sample Item"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
let actionButton = YSSegmentedControl(
frame: CGRect.zero,
titles: [
"No",
"Yes"
])
答案 0 :(得分:0)
出现多个按钮的原因是每次需要新的表格单元时都会调用cellForRowAtIndexPath:方法。由于您可能在该方法体中创建了按钮,因此每次重复使用该单元时都会重新创建该按钮,并且您将看到它们像这样堆叠在顶部。使用dequeueReusableCell的正确方法:使用自定义元素是创建UITableViewCell的子类,并将其设置为故事板中表格单元格的类。然后,当您调用dequeueReusableCell时:您将获得包含所有自定义代码的子类的副本。您需要进行类型转换才能访问任何自定义代码,如下所示:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
if let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as? MyCustomCellClass {
cell.nameLabel.text = "Sample item"
}
// This return path should never get hit and is here only as a typecast failure fallback
return tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath);
}
您的自定义单元格子类看起来像这样:
class MyCustomCellClass: UITableViewCell {
@IBOutlet var nameLabel: UILabel!
@IBOutlet var actionButton: UIButton!
@IBAction func actionButtonPressed(_ sender: UIButton) {
//Do something when this action button is pressed
}
}
答案 1 :(得分:0)
您可以在cellForRowAtIndexPath
中添加新标签/按钮,但在创建和添加新标签/按钮之前,您需要确保没有现有的标签/按钮。一种方法是将标签设置为标签/按钮,在生成新标签/按钮之前,检查带有标签的视图是否已经在单元格中。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
if let label = cell.viewWithTag(111) as? UILabel
{
label.text = "Second Labels"
}
else{
let label = UILabel()
label.tag = 111
label.text = "First Labels"
cell.addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
label.frame = CGRect(x:0, y:10, width: 100, height:30)
}
return cell
}