快速更新表格视图单元格

Posted

技术标签:

【中文标题】快速更新表格视图单元格【英文标题】:Updating table view cells swift 【发布时间】:2019-07-09 05:20:41 【问题描述】:

背景

我有一个简单的账单拆分应用程序,允许用户将餐点分配给多个人或用户。当餐点分配给多人时,价格会相应分摊。餐点(其中包含项目名称和价格是行,用户是部分。

当我删除一行时,我想删除该行,并更新或更改某些其他值(我基本上想在从用户删除项目时将价格重新分配给更少的人)。我的数据模型是multidimensionalarray。这里是:

 struct UserModel 
    var name: String
    var itemModels = [ItemModel]()

    init(name: String, itemModels: [ItemModel]? = nil) 
        self.name = name
        if let itemModels = itemModels 
            self.itemModels = itemModels
        
    


    struct ItemModel 
    var itemName: String
    var price: Double

    init(itemName: String, price: Double) 
        self.itemName = itemName
        self.price = price
    

    class Data 
    static var userModels = [UserModel]()
    static var itemModels = [ItemModel]()

例如,在trailingSwipeActionsConfigurationForRowAt

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? 
    let delete = UIContextualAction(style: .destructive, title: "Delete")  (contextualAction, view, actionPerformed: @escaping (Bool) -> ()) in

        let user = Data.userModels[indexPath.section].name
        let item = Data.userModels[indexPath.section].itemModels[indexPath.row].itemName
        let price = Data.userModels[indexPath.section].itemModels[indexPath.row].price


        ItemModelFunctions.removeFromUser(from: indexPath.section, remove: indexPath.row)

        var duplicate = Data.userModels.filter($0.itemModels.contains(where: $0.itemName == item)).filter($0.name != user) 

        for i in 0..<duplicate.count 
            ???
        
        tableView.reloadData()
        actionPerformed(true)
    
    return UISwipeActionsConfiguration(actions: [delete])

变量var duplicate 返回在indexPath.row 拥有相同项目的其他用户的数组,但不返回拥有该项目的用户(indexPath.section)。我知道这听起来很令人困惑,但如果需要,我可以提供更多代码或 print 语句。

同样在for loop,我想做这样的事情:

for i in 0..<duplicate.count 
    let oldPrice = duplicate[i].price
    let newPrice = oldPrice * duplicate.count
    duplicate[i].price = newPrice

但我无法访问价格。我相信需要indexPath.sectionindexPath.row

如果您做到了这一点,感谢您抽出宝贵的时间。我觉得我需要一个嵌套循环,但我不确定如何实现它。如果有任何其他更简单的方法可以实现这一点,我愿意接受任何建议。

非常感谢!

编辑: 标记的答案有效!如果其他人遇到类似问题,这就是我在trailingSwipeActionsConfigurationForRowAt 中的最终代码:

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? 
    let delete = UIContextualAction(style: .destructive, title: "Delete")  (contextualAction, view, actionPerformed: @escaping (Bool) -> ()) in

        let item = Data.userModels[indexPath.section].itemModels[indexPath.row]
        ItemModelFunctions.removeFromUser(from: indexPath.section, remove: indexPath.row)

        let duplicate = Data.userModels.filter($0.itemModels.contains(item))

        for i in 0..<Data.userModels.count 
            if let idx = Data.userModels[i].itemModels.firstIndex(of: item) 
                let oldPrice = Data.userModels[i].itemModels[idx].price

                let newPrice = oldPrice * Double(duplicate.count+1)

                Data.userModels[i].itemModels[idx].price = newPrice / Double(duplicate.count)
            
        
        tableView.reloadData()
        actionPerformed(true)
    
    return UISwipeActionsConfiguration(actions: [delete])

【问题讨论】:

【参考方案1】:

也许你可以试试这个。祝你好运,如果它不起作用,请发表评论。我是 Swift 新手 :)

let actualItem = Data.userModels[indexPath.section].itemModels[indexPath.row]

for i in 0..<duplicate.count 
  if let idx = duplicate[i].itemModels.firstIndex(of: actualItem) 
     let oldPrice = duplicate[i].itemModels[idx].price
     duplicate[i].itemModels[idx].price = oldPrice * duplicate.count
  

【讨论】:

感谢您的帮助!我实际上无法更新 indexPath.section 和 indexPath.row 中的项目。我需要访问所有其他的。不过没关系!谢谢。

以上是关于快速更新表格视图单元格的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 单元格不会快速更新

除非快速选择所有单元格,否则限制表格视图

是否可以快速显示表格视图单元格索引路径和集合视图索引路径?

如何根据标签文本快速更改表格视图单元格高度?

表格视图中单元格之间的快速距离[关闭]

如何快速订购两个动态表格视图单元格?