在tableView swift的单元格页脚视图中复制行

Posted

技术标签:

【中文标题】在tableView swift的单元格页脚视图中复制行【英文标题】:Duplicating rows within cell footer view of tableView swift 【发布时间】:2020-01-31 12:49:24 【问题描述】:

我在 tableview 中有两个 Xib,一个是单元格自定义 UITableViewCell Xib,第二个是 UIView 自定义视图 xib(即footerView)。单击日期单元格时,它会显示我的约会列表。 (附上图片供参考)。 我从SQLite 获取数据,然后将记录附加到模型。

问题是由于未知原因它重复了footerView 中的约会列表。首先,当它加载数据时它很好。当我移动/滚动 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?

表格视图:

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
    

【问题讨论】:

【参考方案1】:

细胞被重复使用。这意味着当该单元被重复使用时,您对单元所做的任何操作仍然有效。

在您的情况下,每次调用 cellForRowAt 时,您都会向 stackView 添加(更多)子视图。

你可以:

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)
    

【讨论】:

谢谢我已经成功实施了。完美的解决方案。使用footerView 之后的另一件事为什么我没有在单元格之间获得空间?我可以再添加一张图片吗? @Newbie - 如果单元格没有添加子视图,stackViewFooter 的高度将为零。我假设stackViewFooter 被限制在单元格contentView 的底部?如果是这样,并且您希望底部有一些空白空间,请更改该底部约束的 .constant 让我修复它并让你知道。非常感谢。【参考方案2】:

在添加子视图之前,只需检查它是否已经添加,因为每次滚动 tableView 时都会调用 cellForRow。您可以通过为子视图提供 viewTag 或在模型类中维护 bool 值来做到这一点。

【讨论】:

你能举个例子吗?我正在为此努力奋斗

以上是关于在tableView swift的单元格页脚视图中复制行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 的 TableView 中使用页脚在部分下上传标签?

为不同的表视图创建可重用的页脚视图(Swift 5)

swift中UICollectionview的自定义页脚视图

如何在 UITableView swift 3 中使用动画在底部滚动

如何在 swift 3 中的 tableview 单元格中添加带有自定义视图的 collectionView?

强制页脚停留在表格视图中的最后一个单元格下