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 天哪!准备好UITableViewUITableViewController。特别是关于细胞的重用。你的代码有很多错误。 为什么要使用标签? 您好! @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) 而不是自己调用单元格的构造函数或通过查找单元格的标签来找到单元格。

此外,确定单元格状态的部分应该在UITableViewtableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 函数中,而不是willDisplayCell。这可能会解决您的问题并防止重复使用单元格的问题。

【讨论】:

您好!感谢您的回答。首先,我确实在 cellForRow 方法中使用了 tableView.dequeueReusableCell。到了第二点,我把发布的代码移到了cellForRow方法中,但是问题还是出现了。

以上是关于UITableViewCell 只在滚动后显示附件的主要内容,如果未能解决你的问题,请参考以下文章

如何使 UITableViewCell contentview mask UILabel 创建核心动画滚动文本

UITableView 滚动后以编程方式创建的 UITableViewCell 未正确显示

保存 UITableviewcell accessoryView 的状态

在 UITableViewCell 的突出显示上更改附件视图

如何显示 UITableViewCell 附件复选标记

iOS:如何将 UITableViewCell 附件按钮向左移动