Удалить строку из UITableView за пределами делегата TableView - PullRequest
2 голосов
/ 16 октября 2011

Я пытаюсь удалить строку из 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 ]

3 голосов
/ 16 октября 2011

Ваша проблема в том, что данные, которые берутся для заполнения вашей таблицы, не соответствуют таблице после удаления ячейки.Убедитесь, что ваши методы dataSource предоставляют правильные данные после этого (например, если это массив объектов, который вы используете для заполнения таблицы, вы также должны удалить объект из массива)

1 голос
/ 16 октября 2011

Основная проблема заключается в том, что этот метод:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

Должно возвращаться правильное количество строк, , а это не так. Когда вы удаляете элемент из deleg.rmessages, это тот же объект, который используется для предоставления возвращаемого значения вышеупомянутого метод? (Что-то вроде [deleg.rmessages count]?)

Кроме того, по моему опыту, это исключение часто дает вам более подробную информацию, в частности:

  1. Сколько предметов у него было до
  2. Сколько было добавлено / удалено
  3. Сколько ожидается от того, сколько будет после перезагрузки

Видите ли вы что-нибудь подобное, упомянутое? Если так, то стоит включить в ваш вопрос.

Sidenote:

Это плохая идея, на которую можно положиться:

UITableViewCell *buttonCell = (UITableViewCell*)[[btn superview] superview];

Для возврата UITableViewCell. Похоже, вы присваиваете tag кнопки локальной переменной, но никогда не используете ее. (Может быть, это было бы хорошим местом для хранения индекса UITableViewCell, а затем для создания подкласса ячейки для сохранения ивара для кнопки?) Это только часть проблемы.

...