Frame math - худший вариант, если у вас нет выбора.Здесь у вас есть много вариантов выбора.
Например, почему бы вам не использовать tag
, назначенный кнопке?
@objc func btnAction(_ sender: UIButton) {
GlobalVariable.addedExercises.append(currentAnimalArray[sender.tag].name)
}
A swiftier и более эффективное решение - закрытие обратного вызова:
В TableCell
добавьте действие кнопки и свойство callback
.Розетка не нужна.Отключите розетку и подключите кнопку к действию в Интерфейсном Разработчике.При нажатии кнопки вызывается обратный вызов.
class TableCell: UITableViewCell {
// @IBOutlet var b : UIButton!
@IBOutlet var nameLbl : UILabel!
var callback : (()->())?
@IBAction func btnAction(_ sender: UIButton) {
callback?()
}
}
Удалите действие кнопки в контроллере.
В cellForRow
назначьте закрытие для свойства callback
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// no guard, the code must not crash. If it does you made a design mistake
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! TableCell
let animal = currentAnimalArray[indexPath.row]
cell.nameLbl.text = animal.name
cell.callback = {
GlobalVariable.addedExercises.append(animal.name)
}
return cell
}
Вы видите, что путь индекса вообще не нужен.Объект animal
захвачен в замыкании.