首页 > 解决方案 > 单击按钮时在 UITableViewCell 中添加/删除子视图和约束

问题描述

我有一个UITableView用来显示自定义对象数组的。每个对象都有几个属性,包括一个布尔属性,指示该项目是否是新的。

我的UITableViewCell内容视图在情节提要中定义,并具有类似于以下的初始布局:

在此处输入图像描述

在 myUITableViewController中,当我将单元格出列时,我会在 my 上调用一个方法,该方法UITableViewCell将数据配置为在返回之前显示在单元格中。我检查的属性之一是我之前提到的 .isNew 属性。如果这个值为真,那么我将创建一个UIButton并将其作为子视图插入到单元格的内容视图中,所以我最终得到如下内容:

在此处输入图像描述

仅出于上下文考虑,此按钮将显示“新”图像以指示该项目是新的。我还连接了一个在点击按钮时会触发的方法。该方法也在 my 中定义,UITableViewCell如下所示:

@objc func newIndicatorButtonTapped(sender: UIButton!) {
   // call delegate method and pass this cell as the argument
   delegate?.newIndicatorButtonTapped(cell: self)
}

我还创建了一个定义委托方法的协议。我UITableViewController符合这一点,当我点击单元格中的按钮时,我看到该代码触发。这是委托方法(在 my 的扩展中定义UITableViewController):

func newIndicatorButtonTapped(cell: UITableViewCell) {        
    if let indexPath = self.tableView.indexPath(for: cell) {
        print(indexPath.row)
    }
}

当我点击单元格时,我在 Xcode 中正确地看到了indexPath打印输出的行。当我的用户点击此按钮时,我需要删除它(按钮)并更新我的约束,UILabel以便再次与内容视图的前沿对齐,如上面的第一个模型所示。不幸的是,我似乎遇到了单元回收的问题,因为UIButton当我滚动浏览它们时,它们正在消失并重新出现在不同的单元中。我是否需要在单元格回收之前重置单元格的布局/外观,或者我是否误解了单元格回收的工作原理?任何提示将不胜感激!

标签: iosswiftuitableview

解决方案


你可能在想的是你得到了一个“新鲜”的细胞,但是当一个细胞被重新循环时,这意味着它被重新使用了。

通过更改基本单元格的文本颜色,您可以很容易地看到这一点。

例如:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "MyID", for: indexPath) as! MyCustomCell

    if indexPath.row == 3 {
        cell.theLabel.textColor = .red
    }

    return cell
}

如您所料,当第一次加载表格时,第 4 行的文本颜色会发生变化(行索引从零开始)。

但是,假设您有 100 行?当您滚动时,单元格将被重新使用......每次重新使用第 4 个原始单元格时,它仍然会显示红色文本。

因此,正如您所猜想的那样,是的……您需要在每次要使用单元格时将其“重置”为其原始布局/内容/颜色/等:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "MyID", for: indexPath) as! MyCustomCell

    if indexPath.row == 3 {
        cell.theLabel.textColor = .red
    } else {
        cell.theLabel.textColor = .black
    }

    return cell
}

推荐阅读