ПРЕДПОСЫЛКИ
У меня есть простое приложение для разделения счетов, которое позволяет пользователям назначать еду нескольким людям или пользователям.Когда еда назначается нескольким людям, цена делится соответственно.Еда (которая содержит название элемента и цену - это строки, а пользователи - это разделы.
Когда я удаляю строку, я хочу удалить строку и обновить или изменить некоторые другие значения (я в основномхочу переназначить цену на одного человека меньше, когда элемент удален от пользователя.) Моя модель данных: 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])
}