Клетки используются повторно.Вы не сохраняете скрытое состояние ячейки, поэтому при повторном использовании ячейки сохраняется последнее состояние.
В Swift наиболее эффективным и надежным решением является сохранение состояния , добавленного в корзину в модели данных и используйте закрытие обратного вызова для обновления пользовательского интерфейса в cellForRow
.
В модели данных добавьте свойство addedToCart
, предполагается, что в качестве модели данных используется пользовательская структура или класс
var addedToCart = false
В ProductTableViewCell
добавить переменную обратного вызова и IBAction.Подключите IBAction к кнопке
var callback : (()->())?
@IBAction func buttonPressed(_ sender : UIButton) {
callback?()
}
В контроллере в cellForRow
обработайте обратный вызов, products
представляет массив источника данных
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "tblCell") as! ProductTableViewCell
let product = products[indexPath.row]
cell.btnAddToCart.isHidden = product.addedToCart
cell.callback = {
product.addedToCart = true
cell.btnAddToCart.isHidden = true
}
return cell
}
Нет тегов, нет цели / действия, без протоколов, без дополнительной работы в willDisplayCell
.