带有两个自定义单元格的 TableView 导致单元格重用问题(Swift 4)

Posted

技术标签:

【中文标题】带有两个自定义单元格的 TableView 导致单元格重用问题(Swift 4)【英文标题】:TableView with two custom cells causing cell re-use issue (Swift 4) 【发布时间】:2018-04-03 21:18:55 【问题描述】:

我在两个自定义单元格类型之间的 tableView 中显示单元格。第 1 节有几个单元格,第 2 节有一个。

Section-1 单元格有一个标签和一张照片。照片是用 Alamofire 下载的。

Section-2 单元格有一个标签和一张带彩色背景的空白照片。

当 Section-1 中的顶部单元格滚动并出列时,Section-2 单元格从底部出现并正确显示。

但是当我将顶部单元格滚动回视图时,它似乎重新下载了它的图像。仅当我有两个自定义单元格时才会发生这种情况。如果我只有第 1 节单元格并且第一个单元格被滚动,则图像已经存在并且在再次出现时不会重新下载。

任何想法为什么会发生这种情况?这两种细胞类型彼此不同,但似乎仍在发生细胞“重复使用”。

func numberOfSections(in tableView: UITableView) -> Int 

    sections = 0
    if condition1 == true 
        section1 = sections
    
    if condition2 == true 
        sections += 1
        section2 = sections
    
    return sections + 1



func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    if section1 == section 
        return array.count
    
    if section2 == section 
        return 1
    
    return 1



func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cellSection1 = tableView.dequeueReusableCell(withIdentifier: "cellSection1", for: indexPath) as! Section1TableViewCell
    let cellSection2 = tableView.dequeueReusableCell(withIdentifier: "cellSection2", for: indexPath) as! Section2TableViewCell

    func loadImage(url:URL) 
        cellSection1.photo.af_setImage(withURL: url, placeholderImage: UIImage(), completion:  (response) -> Void in
            if response.result.error != nil && response.result.value == nil 
                cellSection1.officialPhoto.image = UIImage()
                cellSection2.photo.backgroundColor = .gray
            
        )
    
    if section1 == indexPath.section 

        let photoUrl = Foundation.URL(string: array[indexPath.row].photoUrl)
        cellSection1.name.text = array[indexPath.row].name
        if photoUrl != nil 
            loadImage(url:photoUrl)
        
        return cellSection1

    
    if section2 == indexPath.section 

        cellSection2.name.text = array[indexPath.row].name
        cellSection2.photo.image = UIImage()
        cellSection2.photo.backgroundColor = .blue
        return cellSection2

    
    return cellSection1


【问题讨论】:

【参考方案1】:

您可以使用 2 个部分假设更新到此

func numberOfSections(in tableView: UITableView) -> Int 

    return 2



func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    if section == 0 
        return array.count
    

    return 1



func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    if(indexPath.section == 0)

         let cellSection1 = tableView.dequeueReusableCell(withIdentifier: "cellSection1", for: indexPath) as! Section1TableViewCell
        // configure cell

       return cellSection1 
    
    else
     
         let cellSection2 = tableView.dequeueReusableCell(withIdentifier: "cellSection2", for: indexPath) as! Section2TableViewCell
         // configure cell


       return cellSection2 

    

【讨论】:

就是这样!非常感谢。我真的很感激。

以上是关于带有两个自定义单元格的 TableView 导致单元格重用问题(Swift 4)的主要内容,如果未能解决你的问题,请参考以下文章

具有两个不同 tableview 单元格的两个 tableview

自定义 Tableview 单元格的问题

单击自定义单元格的 UITextField 后重新加载 TableView

带有Swift的多个自定义单元格的UITableview

带有单个自定义单元格的 UITableView? (苹果手机)

在 UITableView 中处理自定义单元格的点击不会发生