【问题标题】:Swift - sorting tableview data by date only sorting cells within initial viewSwift - 按日期对表格视图数据进行排序,仅对初始视图中的单元格进行排序
【发布时间】:2020-06-25 15:23:53
【问题描述】:

我有一个添加了 100 个数据元素的 UITableView。数据是通过以下方法生成的:

    func generateMockAPIResponse(generate numberRecordsToGenerate: Int) -> [CellData] {
        
        var data: [CellData] = []
        let type = ["PreCount", "PostCount"]
        let location = ["BBS", "LHR", "CDG", "CCF"]
        
        for _ in 1...numberRecordsToGenerate {
            let date = Date().changed(day: -Int.random(in: 0...60)) ?? Date()
            let preTotal = Double.random(in: 500..<1000)
            let postTotal = Double.random(in: 10000..<50000)
            let difference = postTotal - preTotal
            data.append(
                CellData(
                    type: type[Int.random(in: 0..<type.count)],
                    date: date,
                    id: "AG\(String(Int.random(in: 100..<900)))",
                    preTotal: preFuel,
                    postTotal: postFuel,
                    difference: uplift,
                    dur: Double.random(in: 0.80...0.85),
                    location: location[Int.random(in: 0..<location.count)]))
        }
        return data
    }

基本上我在这里生成一个模拟 API 响应。我在 viewDidLoad 中调用了这个方法:

var data = [CellData]()

override func viewDidLoad() {
    super.viewDidLoad()
    
    // To be removed once API is in place
    data = sortAndConvertData(data: generateMockAPIResponse(generate: 100))            
}

然后我有一个 sortAndConvert 函数:

    private func sortAndConvertData(data: [CellData]) -> [CellData] {
        var convertedData: [CellData] = []
        
        for data in data {
            if let preTotal = data.preTotal,
                let postTotal = data.postTotal,
                let difference = data.difference,
                let dur = data.dur,
                
                let convertedPreTotal = // code converts to difference unit of measure,
                let convertedPostTotal = // code converts to difference unit of measure,
                let convertedDifference = // code converts to difference unit of measure,
                let convertedDur = // code converts to difference unit of measure
            {
                
                convertedData.append(
                    CellData(
                        type: data.type,
                        date: data.date,
                        id: data.flightNumber,
                        preTotal: convertedPreFuel,
                        postTotal: convertedPostFuel,
                        difference: convertedUplift,
                        dur: convertedDensity,
                        location: data.location
                    )
                )
            }
        }
        return convertedData.sorted(by: { $0.date?.compare($1.date ?? Date()) == .orderedDescending })
    }
}

所以我最终得到的数据应该按日期排序。然后我声明我的单元格如下:

   override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell: HistoryTableViewCell = tableView.dequeue(indexPath: indexPath)
        cell.data = data[indexPath.row]

        cell.backgroundColor = indexPath.row % 2 == 0 ? UIColor.i6.alternateTableCells : .white
        
        return cell
    }

所以这一切都适用于表格视图中的所有单元格。但是,当用户滚动时,由于出队过程,订单会变得混乱。如何避免订单被可重复使用的单元格破坏?

编辑:

在自定义单元格中设置数据:

   private func populateData() {
        let formatter = DateFormatter()
        formatter.dateFormat = "dd-MMM-yy"
        
        if let dataDate = data?.date,
            let dataPreTotal = data?.preFuel,
            let dataPostTotal = data?.postFuel,
            let dataDifference = data?.uplift,
            let dataDur = data?.density
        {
            typeLabel.text = data?.type
            date.valueLabel.text = formatter.string(from:dataDate)
            id.valueLabel.text = data?.id
            preTotal.valueLabel.text = String(format: "%.0f", dataPrefuel)
            postTotal.valueLabel.text = String(format: "%.0f", dataPostFuel)
            difference.valueLabel.text = String(format: "%.0f", dataUplift)
            dur.valueLabel.text = String(format: "%.2f", dataDensity)
            location.valueLabel.text = data?.location
        }
    }

这被调用:

override func didMoveToSuperview() {
    populateData()
    configureAutoLayout()
}

【问题讨论】:

  • 代码不相关。相关代码是自定义单元格中datadidSet观察者
  • 我刚刚添加了我在自定义单元格类中设置这些值的位置

标签: swift xcode uitableview custom-cell


【解决方案1】:

最后我设法解决了这个问题。问题是我使用 didMoveToSuperView() 调用自定义单元类中的 populateData() 方法

我现在已将此设置为自定义单元格类中数据对象的 didSet() 方法:

    var data: FuelHistoryTableViewController.CellData? {
    didSet {
        populateData()
    }
}

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多