Удалить строку из UITableView за пределами делегата TableView
Я пытаюсь удалить строку из UITableview вне метода делегата. Я вызываю метод, когда нажимаю кнопку внутри ячейки таблицы и пытаюсь удалить строку внутри этого метода. Вот функция, которую я использую
UIButton *btn = (UIButton*)sender;
int tag = btn.tag;
UITableViewCell *buttonCell = (UITableViewCell*)[[btn superview] superview];
NSIndexPath *indexPath = [self.msgTbl indexPathForCell:buttonCell];
[deleg.rmessages removeObjectAtIndex:buttonRow];
[self.msgTbl deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];NSInteger buttonRow = indexPath.row;
[self.msgTbl reloadData];
Используя эту одну или две строки, удаляются, но после этого происходит сбой, выдающий исключение
Количество строк до и после удаления должно быть одинаковым
Как я могу сделать это в IOS? Спасибо
2 ответа
Основная проблема заключается в том, что этот метод:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
Должно вернуть правильное количество строк, а это не так. Когда вы удаляете элемент из deleg.rmessages
Это тот же объект, который используется для предоставления возвращаемого значения вышеуказанного метода? (Что-то вроде [deleg.rmessages count]
?)
Кроме того, по моему опыту, это исключение часто дает вам больше деталей, в частности:
- Сколько предметов у него было раньше
- Сколько было добавлено / удалено
- Сколько он будет иметь против того, сколько у него будет после перезагрузки
Вы видите что-нибудь подобное? Если так, то стоит включить в ваш вопрос.
Примечание:
Это плохая идея полагаться на:
UITableViewCell *buttonCell = (UITableViewCell*)[[btn superview] superview];
Чтобы вернуть UITableViewCell
, Вы, кажется, назначаете tag
кнопки для локальной переменной, но никогда не используйте ее. (Может быть, это было бы хорошим местом для хранения индекса UITableViewCell, а затем для создания подкласса ячейки для сохранения ивара для кнопки?) Это только часть проблемы.
Ваша проблема в том, что данные, которые берутся для заполнения вашей таблицы, не соответствуют таблице после удаления ячейки. Убедитесь, что ваши методы dataSource предоставляют правильные данные после этого (например, если это массив объектов, который вы используете для заполнения таблицы, вы также должны удалить объект из массива)