向单元格动态添加视图会在表格中产生问题
Posted
技术标签:
【中文标题】向单元格动态添加视图会在表格中产生问题【英文标题】:Add view dynamically to cells produce issues in table 【发布时间】:2018-04-06 17:01:11 【问题描述】:我有这个功能:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
let label = UILabel(frame: CGRect(x: 100, y: 14, width: 400, height: 30))
label.text = "\(data[indexPath.row])"
label.tag = indexPath.row
cell.contentView.addSubview(label)
return cell
嗯,通过这个函数,我可以动态添加行列表。 为什么是动态的?因为,列数取决于数据。 不要把注意力放在那个上面。
列表有 244 个元素。 结果显示正常,但是一旦我开始滚动,我就会得到:
如何动态添加元素而不出现此错误?
【问题讨论】:
uitableview 在向下滚动时创建 10 个单元格重新创建单元格视图,您可以在 addsubview 之前使用 cell.contentView.removeFromSuperview() 或使用 cell.textLabel?.text 如果您将其添加为答案,我会将其标记为正确的@a.masri 【参考方案1】:细胞被重复使用。您不断为每个单元格添加越来越多的标签。
正确的解决方案是创建一个包含所需标签的自定义单元格类。然后只需在cellForRowAt
中设置该标签的文本。不要在cellForRowAt
中创建和添加子视图。
但请记住,您可能只想使用UITableViewCell
提供的textLabel
属性。无需自定义单元格或您自己的标签。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
cell.textLabel?.text = "\(data[indexPath.row])"
return cell
【讨论】:
【参考方案2】:我找到了解决办法,希望对你有用!!!
您必须将此代码添加到您的cellForRowAt
:
for item in cell.contentView.subviews
item.removeFromSuperview()
刚拿到单元格。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
for item in cell.contentView.subviews
item.removeFromSuperview()
let label = UILabel(frame: CGRect(x: 100, y: 14, width: 300, height: 30))
label.text = "\(data[indexPath.row])"
label.tag = indexPath.row
let btn = UIButton(type: UIButtonType.custom) as UIButton
btn.backgroundColor = UIColor.red
btn.setTitle("boton", for: .normal)
btn.frame = CGRect(x:0, y:5, width: 80, height:40)
//btn.addTarget(self, action: "buttonPressed:", for: UIControlEvents.touchUpInside)
btn.tag = indexPath.row
cell.contentView.addSubview(btn)
cell.contentView.addSubview(label)
cell.tag = indexPath.row
return cell
【讨论】:
这不是一个好的解决方案。自定义单元格是一种更好的方法。 @maddy,我知道,这只是学习更多关于 swift 的练习的一部分。这就是我在“不要专注于方法”中写的原因,但是,是的,你说得对!custom cell
是更好的方法【参考方案3】:
UITableview 在向下滚动时创建 10 个单元格重新创建单元格视图
您可以使用
cell.contentView.removeFromSuperview()
在cell.contentView.addSubview(label)
之前或使用cell.textLabel?.text
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
cell.contentView.removeFromSuperview()
let label = UILabel(frame: CGRect(x: 100, y: 14, width: 400, height: 30))
label.text = "\(data[indexPath.row])"
label.tag = indexPath.row
cell.contentView.addSubview(label)
return cell
注意此解决方案将删除单元格中的所有子视图
【讨论】:
这段代码有一个严重的错误。此代码实际上删除了单元格的contentView
。不要那样做。这真的很糟糕。您只想删除添加到 contentView
的标签。
@rmaddy 是的,他已经得到了这个,但他只是想确保这项工作的质量,自定义单元格是更好的方法
我不明白你的评论。您发布了具有严重错误的代码。它需要修复。
这只是学习更多关于 swift 的练习的一部分。所以他想问的用户
发布有致命缺陷的代码如何帮助任何人学习?请记住,随着时间的推移,您的答案将被其他人复制和粘贴。您只需要修复一行代码。以正确的方式为您的答案感到自豪。以上是关于向单元格动态添加视图会在表格中产生问题的主要内容,如果未能解决你的问题,请参考以下文章
如何向 UICollectionView 动态添加新单元格?