Дублирование строк в представлении нижнего колонтитула ячейки tableView swift - PullRequest
0 голосов
/ 31 января 2020

У меня есть два Xib в табличном виде, один - это пользовательская ячейка UITableViewCell Xib, а второй - пользовательский вид UIView xib (который равен footerView). При нажатии на ячейку даты отображается список встреч. (изображение прилагается для справки). Я получаю данные от SQLite, а затем записи добавляются в модель.

  • Проблема по неизвестной причине, она дублирует список встреч в footerView. Сначала, когда он загружает данные, это нормально. Когда я перемещаю / scorll tableView или возвращаюсь к той же самой странице, это показывает дубликат.
  • Я использовал for loop отображение записи списка встреч в footerView. (в cellForRowAt )
  • Я проверил, но нет повторяющихся данных, добавляемых в массив модель var downloadAppData: [DownloadDisplay] = []

Как избежать дублирования строк представления нижнего колонтитула в ячейке TableView?

замедление: var downloadAppData: [DownloadDisplay] = []

Модель:

struct DownloadDisplay : Codable {
    var date: Int64?
    var appointments: [Appointment]?
    var progress: Double?
    var isFinished: Bool?
}

struct Appointment : Codable {

    let appointmentHour : String?
    let backgroundColorDark : String?
    let backgroundColorLight : String?
    let controlHour : String?
    let date : String?
    let id : Int?
    let isProjectManual : Bool?
    let projectDistrict : String?
    let projectFirmName : String?
    let projectName : String?
    let projectType : String?
    let subTitle : String?
    let warmingType : String?
}

TableView:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return downloadAppData.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "DownloadEntryViewCell", for: indexPath) as! DownloadEntryViewCell
        let dic = downloadAppData[indexPath.row]
        let content = datasource[indexPath.row]


        let appDate = Date(milliseconds: dic.date ?? 0)        
        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "tr_TR_POSIX")
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        dateFormatter.dateFormat = "dd MMMM yyyy EEEE"
        let convertDate = dateFormatter.string(from: appDate)

        cell.fileNameLabel.text = "\(convertDate)" + " Randevuları"

        var stackHeight:CGFloat = 0.0

        // footer view xib. 
        for i in (dic.appointments)! {
            let child_view = Bundle.main.loadNibNamed("FooterView", owner: self, options: nil)?.first as! FooterView
            child_view.projName.text = "\(i.projectName ?? "")" + "  " + "\(i.subTitle ?? "")"
            cell.stackViewFooter.addArrangedSubview(child_view)
            stackHeight = stackHeight + 33.0
        }


        if content.expanded == false {

            cell.rightView.backgroundColor = ("#556f7b").toColor()
            cell.fileNameLabel.textColor = ("#eceff1").toColor()
            cell.progressLabel.textColor = ("#eceff1").toColor()
            cell.individualProgress.frame = CGRect(x: 0, y: 69, width: 360, height: 2)
            cell.individualProgress.progress = 0
            cell.individualProgress.backgroundColor = ("#cfd8dc").toColor()

       }

        return cell
    }

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Ячейки используются повторно . Это означает, что все, что вы делаете с ячейкой, все равно будет действовать, когда эта ячейка используется повторно.

В вашем случае вы добавляете (больше) подпредставлений в stackView каждый раз, когда вызывается cellForRowAt.

Вы можете либо:

A) отредактировать класс ячейки и реализовать prepareForReuse(), где вы удалите все существующие подпредставления из stackView

override func prepareForReuse() {
    self.stackViewFooter.subviews.forEach {
        $0.removeFromSuperview()
    }
}

или

B) удалить подпредставления перед добавлением новых в cellForRowAt

    // first
    cell.stackViewFooter.subviews.forEach {
        $0.removeFromSuperview()
    }

    // then
    for i in (dic.appointments)! {
        ...
        cell.stackViewFooter.addArrangedSubview(child_view)
    }
0 голосов
/ 31 января 2020

Перед добавлением подпредставления просто убедитесь, что оно уже добавлено или нет, потому что cellForRow вызывается каждый раз, когда вы прокручиваете tableView. Это можно сделать, присвоив viewTag подпредставлению или поддержав значение bool в классе модели.

...