swift - 如何根据相同的 id 添加两行 TableView

标签 swift uitableview

首先我附上场景图片:

enter image description here

我想添加相同的 subID 并将它们显示在一行中,同时添加它们的总数。应该有任何我找不到的简单数组追加或映射函数。我的 cellForRowAt indexPath: 看起来像这样:

   var walletTransactionModel = [WalletTransactionModel]()
   ...

   let cell = tableView.dequeueReusableCell(withIdentifier: "walletCell", for: indexPath)
   let data = walletTransactionModel[indexPath.row - 1]
   let myNumber = doubleToIntWhenDecimalZero(number: data.amount)
   cell.textLabel?.text = "\(data.slug) | \(data.name) | \(myNumber)"
   return cell

我的简单模型如下所示:

import Foundation
import SwiftyJSON

class WalletTransactionModel {
var slug: String
var name: String
var amount: Double

required init(slug: String, name: String, amount: Double) {
    self.slug = slug
    self.name = name
    self.amount = amount
}

convenience init?(item: JSON) {
    guard let slug = item["slug"].string,
           let name = item["name"].string,
        let amount = item["amount"].double else { return nil}

    self.init(slug: slug, name: name, amount: amount)
}

}

如有任何帮助,我们将不胜感激。

最佳答案

我认为最好的办法是在尝试将数据显示在 TableView 中之前确保数据正确无误。加载数据后,运行一个处理步骤,将数据缩减为您想要的形式。

像这样(复制粘贴到 playground):

import Foundation

class WalletTransactionModel {
    var slug: String
    var name: String
    var amount: Double

    required init(slug: String, name: String, amount: Double) {
        self.slug = slug
        self.name = name
        self.amount = amount
    }
}

var data = [WalletTransactionModel(slug: "subID1", name: "James", amount: 1),
            WalletTransactionModel(slug: "subID1", name: "James", amount: 2),
            WalletTransactionModel(slug: "subID2", name: "Sarah", amount: 10),
            WalletTransactionModel(slug: "subID2", name: "Sarah", amount: 20)]


var reducedData = data.reduce( [WalletTransactionModel]()) { (partial, model) in
    var partial = partial

    let matchingIndex = partial.firstIndex(where: { (existingModel) -> Bool in
        existingModel.slug == model.slug
    })

    if let matchingIndex = matchingIndex {
        partial[matchingIndex].amount += model.amount
    } else {
        partial.append(model)
    }

    return partial
}

for model in reducedData {
    print("\(model.slug) \(model.amount)")
}


您可能可以更有效地执行此操作,但希望您清楚那里发生了什么。基本上它会减少您现有的数据,并在每个部分结果上检查该 id 是否已添加到新结果中。如果有,则将金额相加,否则将模型添加到新结果中。

这将处理您的数据,并创建一个新的数据数组。然后,您可以将其用作您的 TableView 数据源,除了显示该行外,您无需在 cellForRowAtIndex 中执行任何操作。

关于swift - 如何根据相同的 id 添加两行 TableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57566999/

相关文章:

ios - [CLLocationCoordinate2d]?没有名为下标的成员

swift - 如何覆盖私有(private)方法并快速调用 super?

core-data - Core Data 使用 Swift 保存数据

ios - 包含在对 Firebase 的查询中

ios - 如何在 swift 中为每个循环添加新行?

ios - Swift 4 .plist 处理

ios - 如何将 NSDictionary 添加到 NSArray 以在 tableview 中使用它

ios - 如何在 iOS sdk 的 tableview 中左右滑动

ios - 从 UIAlertController 重新加载 tableView 数据不起作用

swift - 在动态 tableView 的 tableViewCell 中从动态 collectionViewCell 执行 Segue With Identifier,swift