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

时间:2018-04-03 21:18:56

标签: ios swift uitableview

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

第1节细胞有标签和照片。照片是用Alamofire下载的。

第2节细胞有一个标签和一张带有彩色背景的空照片。

当第1节中的顶部单元格滚动并出列时,第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 个答案:

答案 0 :(得分: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 

    }