UITableViewCell 只在滚动后显示附件
Posted
技术标签:
【中文标题】UITableViewCell 只在滚动后显示附件【英文标题】:UITableViewCell only displays accessory after scrolling 【发布时间】:2017-09-12 12:53:24 【问题描述】:所以我有一个带有自定义单元格的 TableView,这些单元格是通过从服务器获取数据而制作的。我有一个变量“selectedIndex”,我用它来跟踪并向我的单元格添加复选标记附件。奇怪的是,它仅在我滚动选定的单元格后才有效(带有 indexPath.row 的单元格等于离开屏幕并返回。这是我的 willDisplayCell 方法中的代码:
if selectedIndex == indexPath.row
if let accessory = cell.viewWithTag(528) as? UITableViewCell
accessory.frame = (cell.checkmarkView.bounds.offsetBy(dx: 0, dy: 7))
accessory.accessoryType = .checkmark
accessory.isUserInteractionEnabled = false
accessory.backgroundColor = UIColor.clear
accessory.tag = 528
accessory.isHidden = false
print("accessory not nil")
else
let accessory = UITableViewCell()
accessory.frame = (cell.checkmarkView.bounds.offsetBy(dx: 0, dy: 7))
accessory.accessoryType = .checkmark
accessory.isUserInteractionEnabled = false
accessory.backgroundColor = UIColor.clear
accessory.tag = 528
accessory.isHidden = false
cell.addSubview(accessory)
print("accessory nil")
else
let accessory = cell.viewWithTag(528)
accessory?.isHidden = true
例如,当所选索引为0时,第一次视图中未显示复选标记,以及日志打印(“附件nil”)。当我在屏幕外滚动索引 0 处的单元格并再次滚动到它时,现在会显示复选标记并打印日志(“附件不是零”)。要了解更多信息,点击单元格会按预期工作。
编辑:
我知道我正在将另一个 TableViewCell 添加到我的单元格中!我这样做只是因为我需要我的复选标记附件位于与默认位置(右对齐、垂直居中)不同的位置(左对齐、上对齐)。所以我所做的是在我的 XIB 中添加一个位于所需位置(右对齐、上对齐)的视图,并将我以编程方式制作的单元格与其对齐。如果您能告诉我另一种方法,将不胜感激。
从第一个 if 中删除了 cell.addSubview。仍然表现相同。
谢谢!
【问题讨论】:
您在UITableViewCell
中一遍又一遍地添加UITableViewCell
天哪!准备好UITableView
和UITableViewController
。特别是关于细胞的重用。你的代码有很多错误。
为什么要使用标签?
您好! @ReinierMelian 请查看我的更新。
@mugiwara528 如果您使用的是自定义 xib,为什么要在另一个单元格中添加?使用您的 xib 作为您的主要单元格,在您的 tableView 中注册为重用单元格
【参考方案1】:
您正在将UITableViewCell
添加到您的出列原始单元格,这是不必要的,您需要在您的cellForRowAt
datasource 方法中实现此逻辑,
更新
如果您需要为附件视图自定义位置,请使用 cell.layoutMargins
检查我的更新代码
试试这个
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellIdentifier", for: indexPath) as! YourCellClass
cell.accessoryType = .none
if selectedIndex == indexPath.row
cell.accessoryType = .checkmark
//if you need a custom position for your accessory view
cell.layoutMargins = UIEdgeInsetsMake(0, 0, 0, 100)
【讨论】:
您好,感谢您更新的答案。但是,UIEdgeInsertMake 中的顶部和底部参数似乎不起作用。我想把我的复选标记放在右上角。 我会检查@mugiwara528【参考方案2】:UITableView
将通过重用您的单元格来优化它们。因此,在您的情况下,最好使用tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath)
而不是自己调用单元格的构造函数或通过查找单元格的标签来找到单元格。
此外,确定单元格状态的部分应该在UITableView
的tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
函数中,而不是willDisplayCell。这可能会解决您的问题并防止重复使用单元格的问题。
【讨论】:
您好!感谢您的回答。首先,我确实在 cellForRow 方法中使用了 tableView.dequeueReusableCell。到了第二点,我把发布的代码移到了cellForRow方法中,但是问题还是出现了。以上是关于UITableViewCell 只在滚动后显示附件的主要内容,如果未能解决你的问题,请参考以下文章
如何使 UITableViewCell contentview mask UILabel 创建核心动画滚动文本
UITableView 滚动后以编程方式创建的 UITableViewCell 未正确显示
保存 UITableviewcell accessoryView 的状态