Работа над приложением с табличным представлением. В каждой ячейке по две кнопки (Пройден / Не пройден). Если пользователь нажимает на «ОК», цвет фона меняется на зеленый и на «!». сбой, фон изменится на красный. Проблема, с которой я сталкиваюсь, заключается в том, что если нажать кнопку подряд (скажем, кнопку сбоя). При прокрутке переходите к другой строке (например, на 5 строк вниз). Цвет фона кнопки сбоя также изменился (красный).
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell: CellTableViewCell! = tableView.dequeueReusableCell(withIdentifier: "cell") as! CellTableViewCell
if cell == nil
{
cell = CellTableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
cell.textLabel?.text = myArray[indexPath.row]
cell.fail.tag = indexPath.row
cell.fail.addTarget(self, action: #selector(ViewController.errorBtn(_:)), for: .touchUpInside)
}
else
{
cell.textLabel?.text = myArray[indexPath.row]
cell.fail.tag = indexPath.row
cell.fail.addTarget(self, action: #selector(ViewController.errorBtn(_:)), for: .touchUpInside)
}
return cell
}
вот ссылка на быстрый макет приложения с кодом, у которого возникла проблема. https://github.com/morenoa/iOS3/tree/master/Table%20Cell Любая помощь приветствуется Благодарю. Извините, если репост. Просто в тупике.





Похоже, что ваше приложение не может знать, что оно должно вернуться к зеленому цвету, поскольку вы только реализовали функцию, чтобы изменить его на предупреждение / красный, но вы ничего не проверяете, поэтому, когда вы завершите действие в своем операторе if, тогда все клетки изменятся, поскольку они не знают другого.
надеюсь, это поможет
Вы можете отслеживать состояние кнопки, изменив массив на словарь и установив значение true / false.
Например, для var myArray = ["my": false, "hello": false]
затем установите состояние в cellForRowAt cellForRowAt в соответствии со значением ключа, а в func errorBtn(_ sender: UIButton) просто переключите выбранное значение кнопки.
Во-первых, вы должны сохранить ссылку, если кнопка уже выбрана. Во-вторых, лучше установить цвет фона кнопки на функции cellForRowAt.
Сохранить ссылку на выбранную кнопку можно разными способами. Обычно я использовал массив объектов, у которых на объекте был атрибут bool.
В вашем случае, я думаю, самый простой способ - это так, поскольку у вас уже есть массив строк, который используется для заголовка ячейки. Вы можете создать массив bool для сохранения состояния кнопки. Такой как:
var myArraySelected:[Bool] = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
Затем на cellForRowAt поместите этот код, чтобы установить цвет фона кнопки
if (myArraySelected[indexPath.row]){
cell.fail.backgroundColor = UIColor.red
}else{
cell.fail.backgroundColor = UIColor(red: 214.0/255.0, green: 214.0/255.0, blue: 214.0/255.0, alpha: 1.0)
}
Наконец, измените действие errorBtn на:
@IBAction func errorBtn(_ sender: UIButton) {
myArraySelected[(sender as AnyObject).tag] = true
self.tableView.reloadData()
}
Не забудьте создать выход для табличного представления.
Вы должны проверить, выбрана ли кнопка уже или нет в cellForRowAt, а затем соответствующим образом изменить цвет фона.