Удалить из массива в табличном представлении по выбранному индексу

Я пытаюсь удалить строку в табличном представлении, которое я представляю, используя массив объектов. Я добавил кнопку удаления в углу, и при щелчке она должна удалить выбранную строку, но вместо этого она всегда удаляет первую строку, независимо от того, на какую строку я нажимаю.

Сначала я объявил переменную: private var indexForCell = Int(), затем я использую метод tableview didSelectRowAt следующим образом:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        indexForCell = indexPath.row
    }

Затем я использую свою кнопку, которую я добавил для удаления:

    @IBAction func removePokemon(_ sender: UIButton) {
        favourites.remove(at: indexForCell)
        self.tableView.reloadData()
    }

Это приводит к удалению строки, но всегда первой. Какую бы строку я ни выбрал, она всегда удаляет первую строку. Как я могу остановить это?


person Sabih    schedule 01.09.2020    source источник
comment
Посмотрите здесь, как вы можете удалять строки в табличном представлении. stackoverflow.com/a/52818024/7905888   -  person A. Amini    schedule 01.09.2020
comment
Вы должны обновить свой вопрос, чтобы было ясно, что у вас есть кнопка удаления в каждой ячейке представления таблицы, и вы хотите иметь возможность нажать эту кнопку и удалить эту конкретную ячейку. Если это так, ваш подход к сохранению индекса ячейки, когда пользователь выбирает ячейку, не будет работать, поскольку вы можете нажать кнопку в ячейке, не выбирая ячейку сначала.   -  person Duncan C    schedule 02.09.2020
comment
Задавая вопрос, вам необходимо достаточно подробно описать ситуацию, чтобы ваши читатели полностью ее поняли. Ваш вопрос расплывчатый и неполный, как написано. Я воздержусь от голосования против него, но он нуждается в улучшении.   -  person Duncan C    schedule 02.09.2020


Ответы (1)


Строка кода private var indexForCell = Int() — это ошибка, ожидающая своего появления. Int() разрешается в ноль, что означает первую строку. Таким образом, если вы никогда не выберете строку, она попытается удалить первую.

Сделайте переменную опциональной:

private var indexForCell = Int?

Затем перепишите функцию удаления:

@IBAction func removePokemon(_ sender: UIButton) {
    guard let indexToRemove = indexForCell else {
        print("No index selected")
        return
    }
    favourites.remove(at: indexToRemove)
    self.tableView.reloadData()
}

Но вы не говорите нам, что делает ваша функция favourites.remove(at:), и вы не говорите нам, как вы заполняете свое табличное представление, поэтому трудно сказать, есть ли другие проблемы.

(Кстати, есть лучшие способы удалить отдельную ячейку, чем перезагружать представление всей таблицы, но давайте пока сосредоточимся на том, чтобы ваш текущий подход работал.)

Редактировать:

Если у вас есть кнопка удаления в каждой ячейке, из которой вы хотите удалить элемент, не выбирая его, вам нужен способ выяснить, какая ячейка содержит кнопку. Я написал расширение табличного представления, которое позволяет вам понять это. См. эту ссылку: https://stackoverflow.com/a/42043277/205185

person Duncan C    schedule 01.09.2020
comment
Это несколько работает! по крайней мере, теперь я могу удалить любые строки, независимо от того, в каком индексе они находятся, но есть небольшая проблема. Мне нужно было бы выбрать строку, чтобы удалить ее. Когда я нажимаю кнопку, которую я сделал в своей ячейке, она не печатает выбранный индекс, но когда я нажимаю саму ячейку, а затем нажимаю кнопку, она удаляет ячейку. Я должен выбрать ячейку, а затем нажать кнопку на ячейке, чтобы удалить ее. Я хотел, чтобы он удалялся напрямую при нажатии кнопки без выбора строки - person Sabih; 01.09.2020
comment
У вас есть кнопка удаления на каждой ячейке? Если это так, вам нужно выяснить, какая ячейка содержит кнопку в вашем коде действия. Используйте frame.origin кнопки, преобразованный в координаты табличного представления, чтобы выяснить, какая ячейка содержит кнопку. Я написал расширение табличного представления, которое позволяет определить, какой путь индекса содержит представление, и разместил его здесь, на SO. Я постараюсь найти для вас ссылку. - person Duncan C; 01.09.2020