Вы можете передавать значения обратно в замыканиях.
Итак, в вашем классе Cell
(именование сбивает с толку - сделайте что-то вроде SelectItemCell
), вы можете изменить свою переменную замыкания на:
var addActionHandler: ((Int) -> Void)?
Затем, в вашем действии addToCart
, что-то вроде этого:
@IBAction func atcBtn(_ sender: UIButton) {
// pass back the user selected values
var i = 0
switch lastSelectedButton {
case optionBtn1:
i = 1
case optionBtn2:
i = 2
default:
i = 3
}
self.addActionHandler?(i)
}
Это довольно неловко, и, вероятно, вы будете отслеживать фактические значения, но, например, для этогобудет работать.
Теперь в вашем VC, который содержит эту таблицу, в cellForRowAt
вместо текущего:
cell.addActionHandler = {
Cart.currentCart.items.append(item)
}
назначьте закрытие следующим образом:
cell.addActionHandler = { (option: Int) in
print("Option selected = \(option)")
// do something based on the option that was selected
// maybe item.selectedOption = option
Cart.currentCart.items.append(item)
}
Если вы хотите передать более одного значения, добавьте параметры:
var addActionHandler: ((Int, Int) -> Void)?
и в вашем действии кнопки:
self.addActionHandler?(priceVal, weightVal)
и ваше закрытие станет:
cell.addActionHandler = { (price: Int, weight: Int) in
// use price and weight vars
// ...
}
Редактировать
Если у вас еще нет свойства .selectedOption
вашего класса Items
, вы должны добавить одно (типа Int). Вы можете использовать это для отслеживания выбора пользователя.
Измените ваш cellForRowAt
функционал следующим образом:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? Cell else { return UITableViewCell() }
// use var to make item mutable
var item = itemSetup[indexPath.row]
// pass item to cell to configure labels / buttons / etc
cell.configure(withItem: item)
// when the "add to cart" button in the cell is tapped
cell.addActionHandler = { (option: Int) in
// option will be 1, 2 or 3, indicating which button the user tapped
print("Option selected = \(option)")
// update the .selected property of your data
item.selectedOption = option
Cart.currentCart.items.append(item)
}
return cell
}
Теперь, в вашем CartCell
в вашем CartViewController
, вы можетезаполните метки так:
if items.selectedOption == 1 {
lblSubTotal.text = "$\(formatter.string(for: items.price1)!)"
lblWeight.text = "\(items.weight1)"
} else if items.selectedOption == 2 {
lblSubTotal.text = "$\(formatter.string(for: items.price2)!)"
lblWeight.text = "\(items.weight2)"
} else if items.selectedOption == 3 {
lblSubTotal.text = "$\(formatter.string(for: items.price3)!)"
lblWeight.text = "\(items.weight3)"
}