Swift 3 自定义单元格在滚动时更改

Posted

技术标签:

【中文标题】Swift 3 自定义单元格在滚动时更改【英文标题】:Swift 3 Custom Cell Changing on scroll 【发布时间】:2016-09-29 09:41:32 【问题描述】:

抱歉,我知道这是一个重复的问题,但我无法理解其他问题的答案。

我的自定义单元格在滚动时发生变化。我知道这是由于重用标识符,但我不知道如何修复它。任何帮助,将不胜感激。我也在使用 indexPath.row 来访问一个数组。

如何让我的表格视图在滚动时不更改值,即使我使用了重用标识符?

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell : TeamCell = tableView.dequeueReusableCell(withIdentifier: "TeamCell", for: indexPath) as! TeamCell

    cell.trainer.image = UIImage(named: "t\(Player.User.Gold.trainers[(indexPath as NSIndexPath).row].imageID)")
    if Player.User.Gold.trainers[(indexPath as NSIndexPath).row].p1.name != 0 
        cell.pokemon1.image = UIImage(named: "\(Player.User.Gold.trainers[(indexPath as NSIndexPath).row].p1.name)")
        cell.pokemon1.isHidden = false
     else 
        cell.pokemon1.isHidden = true
    
    if Player.User.Gold.trainers[(indexPath as NSIndexPath).row].p2.name != 0 
        cell.pokemon2.image = UIImage(named: "\(Player.User.Gold.trainers[(indexPath as NSIndexPath).row].p2.name)")
        cell.pokemon1.isHidden = false
     else 
        cell.pokemon2.isHidden = true
    
    if Player.User.Gold.trainers[(indexPath as NSIndexPath).row].p3.name != 0 
        cell.pokemon3.image = UIImage(named: "\(Player.User.Gold.trainers[(indexPath as NSIndexPath).row].p3.name)")
        cell.pokemon1.isHidden = false
     else 
        cell.pokemon3.isHidden = true
    
    if Player.User.Gold.trainers[(indexPath as NSIndexPath).row].p4.name != 0 
        cell.pokemon4.image = UIImage(named: "\(Player.User.Gold.trainers[(indexPath as NSIndexPath).row].p4.name)")
        cell.pokemon1.isHidden = false
     else 
        cell.pokemon4.isHidden = true
    
    if Player.User.Gold.trainers[(indexPath as NSIndexPath).row].p5.name != 0 
        cell.pokemon5.image = UIImage(named: "\(Player.User.Gold.trainers[(indexPath as NSIndexPath).row].p5.name)")
        cell.pokemon1.isHidden = false
     else 
        cell.pokemon5.isHidden = true
    
    if Player.User.Gold.trainers[(indexPath as NSIndexPath).row].p6.name != 0 
        cell.pokemon6.image = UIImage(named: "\(Player.User.Gold.trainers[(indexPath as NSIndexPath).row].p6.name)")
        cell.pokemon1.isHidden = false
     else 
        cell.pokemon6.isHidden = true
    

    return cell

(该函数只检查数组的值是否为0,如果不是则显示图像)

【问题讨论】:

为什么要在每个 if 中设置 pok1 为 hidden= flase?不应该是你设置图像的口袋妖怪吗? 我犯了一个新手错误,没有更改 if 语句中的正确值!哎呀 是的,修复了它!我脸红了,谢谢啊哈 太棒了,玩得开心编码...哦,还有一个建议,读取一次培训师数据并将其放入变量中,因此您可以仅在最佳条件下使用此变量,而无需每次都获取再来一次 【参考方案1】:

就像 cmets 所说的那样,问题在于 pokemon1 在每个 if 中的明显设置错误。

编辑

好吧,因为投反对票,我会更准确: 在每个 if 条件下,您都将 pokemon1 设置为可见。您需要使用您设置为图像的 Pokomen。

玩得开心编码

【讨论】:

【参考方案2】:

将你的每个口袋妖怪images 设置为nil 或一些常见的placeholder image 紧跟在dequeue 单元格之后,然后放置你的每个if-conditions 并设置每个图像视图的默认隐藏属性,就像你的图像视图是默认隐藏然后将其隐藏属性设置为true,然后再将图像设置为if条件!

【讨论】:

好吧,这只是一个与他不同的实现。我认为问题是在每个 if 上设置可见的错误口袋妖怪 Tableview 重用单元格,因此如果对于特定单元格,如果没有可用的图像,那么它会显示已为前一个单元格设置的旧图像!所以让它为零,每次都会使 imageview 的图像为零,如果没有可用于单元格的图像,那么它将保持为零或一些占位符图像! 但他将其设置为 hidden = false

以上是关于Swift 3 自定义单元格在滚动时更改的主要内容,如果未能解决你的问题,请参考以下文章

集合视图,具有自定义布局,单元格在滚动时行为不端

tableView 单元格内的多个 collectionView 单元格在滚动时更改设计

用于 UITableView 的自定义 XIB 单元格在滚动时卡住/卡住

为啥我的 UITableView 单元格在滚动时重叠?

UITableView 单元格在向下滚动然后备份后消失

UICollectionView 单元格在可见时不断重新加载