ios - 单击按钮时在 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
当我滚动浏览它们时,它们正在消失并重新出现在不同的单元中。我是否需要在单元格回收之前重置单元格的布局/外观,或者我是否误解了单元格回收的工作原理?任何提示将不胜感激!
解决方案
你可能在想的是你得到了一个“新鲜”的细胞,但是当一个细胞被重新循环时,这意味着它被重新使用了。
通过更改基本单元格的文本颜色,您可以很容易地看到这一点。
例如:
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
}
推荐阅读
- c++ - 通过指针缓慢访问共享内存
- mongodb - MongoDB 备份和 Docker 问题
- javascript - 在 jQuery 中包含动态脚本
- swift - 条件绑定的初始化程序必须具有 Optional 类型,而不是“AnimationView”
- python - 安装地理熊猫
- python - 如何使用 python 抓取耐克页面上的所有鞋子
- java - 范围总和与分配的while循环
- c# - 我可以在 LINQ 查询中使用 Math.Max() / Math.Min() 吗?
- html - 使用默认 div 链接多个 div
- python - discord.ext.commands.errors.CommandInvokeError:命令引发异常:ValueError:int()的无效文字,基数为10:''