细胞重复使用的重叠按钮

时间:2017-06-16 00:52:10

标签: ios swift uitableview

我在UITableView中出现了可重复使用的单元格功能。 tableview有几个单元格,每个单元格都包含一个按钮。

当我滚动时,将重新创建单元格,并且新按钮开始与旧按钮重叠(直到我在同一单元格中有一堆相同的按钮)。我听说你应该使用removeFromSuperview函数来解决这个问题,但我不确定该怎么做。

这是我的应用的图片:

image

这是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"
        ])

2 个答案:

答案 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
}