Обновление ячеек табличного представления swift - PullRequest
1 голос
/ 09 июля 2019

ПРЕДПОСЫЛКИ

У меня есть простое приложение для разделения счетов, которое позволяет пользователям назначать еду нескольким людям или пользователям.Когда еда назначается нескольким людям, цена делится соответственно.Еда (которая содержит название элемента и цену - это строки, а пользователи - это разделы.

Когда я удаляю строку, я хочу удалить строку и обновить или изменить некоторые другие значения (я в основномхочу переназначить цену на одного человека меньше, когда элемент удален от пользователя.) Моя модель данных: multidimensional array. Вот она:

 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.section и indexPath.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 Ответ

2 голосов
/ 10 июля 2019

Возможно, вы можете попробовать это.Желаем удачи, пожалуйста, прокомментируйте, если это не работает.Я новичок в 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
  }
}
...