Есть несколько проблем с вашим подходом, но основная проблема заключается в следующем:
Ячейки табличного представления повторно используются . Вы не можете полагаться на состояние элемента ячейки, потому что, когда вы перезагружаете таблицу, эта ячейка больше не будет связана с тем же элементом в ваших данных.
В основном вам нужно создать data объект, который будет отслеживать «выбранное» состояние вашего списка. Вы можете начать вот так ...
Определите объект данных:
struct MyItem {
var itemName: String = ""
var isSelected: Bool = false
}
Когда вы загружаете свой контроллер представления, создайте массив этого объекта, и заполните его:
class ViewController: UIViewController {
var itemsArray: [MyItem] = []
override func viewDidLoad() {
super.viewDidLoad()
let itemListArray = ["Australia", "Brazil", "Canada","China", "Germany", "India", "Malaysia", "Pakistan", "Russia", "South Africa", "United States of America"]
itemListArray.forEach { s in
itemsArray.append(MyItem(itemName: s, isSelected: false))
}
}
}
Теперь у вас есть массив из MyItem
объектов, каждый из которых имеет «имя» из вашего списка и для каждого установлено значение «не выбран».
Когда вы измените состояние "selected", вы можете сделать что-то вроде этого:
@objc func checkMarkButtonClicked ( sender: UIButton) {
print("button presed")
//print_SHLog(sender.tag)
// toggle the selected state of the button
sender.isSelected.toggle()
// update the selected state in your data array
itemsArray[sender.tag].isSelected = sender.isSelected
}
Когда вы отображаете свои ячейки, вы будете делать что-то вроде этого:
cell.lbl_LocationName?.text = self.itemsArray[indexPath.row].itemName
cell.btn_CheckList?.isSelected = self.itemsArray[indexPath.row].isSelected
cell.btn_CheckList?.tag = indexPath.row
cell.btn_CheckList?.addTarget(self, action: #selector(checkMarkButtonClicked(sender:)), for: .touchUpInside)
Однако вы Мне действительно нужно отслеживать два массива данных - «полный» массив и «фильтрованный» массив. Конечно, «отфильтрованный» массив не может использовать indexPath.row
напрямую, потому что вам нужно обновить свойство .isSelected
вашего элемента в «полном» массиве, чтобы оно было там при изменении фильтра.
Это может помочь вам, но я бы посоветовал поискать и просмотреть некоторые примеры отслеживания изменений данных при использовании поля поиска для фильтрации данных и найти лучшие примеры того, как управлять кнопками в ячейках.