iPhone-App аварийно завершает работу при удалении строки UITableView

У меня есть UITableView, который использует одноэлементный объект в качестве источника данных.

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

Методы:

-(void)viewDidLoad
{

some initialization code-----

UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithTitle:@"Delete"                                                        style:UIBarButtonItemStyleBordered                                                                 target:self                                                     action:@selector(toggleEdit:)];
       self.navigationItem.rightBarButtonItem = editButton;
       [editButton release];

}

-(IBAction)toggleEdit:(id)sender
{
    [self.myOrderTable setEditing:!self.myOrderTable.editing animated:YES];

    if(self.myOrderTable.editing)
        [self.navigationItem.rightBarButtonItem setTitle:@"Done"];
    else 
    {
     [self.navigationItem.rightBarButtonItem setTitle:@"Delete"];
    }

}

-(void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath
{
    NSUInteger row = [indexPath row];

    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                     withRowAnimation:UITableViewRowAnimationFade];

}

Однако я получаю следующее исключение при попытке нажать кнопку удаления:

Ошибка подтверждения в -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1448.89/UITableView.m:995

Завершение работы приложения из-за необработанного исключения "NSInternalInconsistencyException", причина: "Недопустимое обновление: недопустимое количество строк в разделе 1. Число строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк, содержащихся в этом раздел до обновления (1), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено).'

*** Call stack at first throw:
(
    0   CoreFoundation                      0x010305a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x01184313 objc_exception_throw + 44
    2   CoreFoundation                      0x00fe8ef8 
+[NSException raise:format:arguments:] + 136
    3   Foundation                          0x001153bb -
[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
    4   UIKit                               0x00398e8b -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 8420
    5   UIKit                               0x00387cf8 -
[UITableView deleteRowsAtIndexPaths:withRowAnimation:] + 56
    6   Restaurant                          0x000117f9 -
[MyOrderViewController tableView:commitEditingStyle:forRowAtIndexPath:] + 114
    7   UIKit                               0x00385037 -[UITableView(UITableViewInternal) animateDeletionOfRowWithCell:] + 101
    8   UIKit                               0x0031a4fd -[UIApplication sendAction:to:from:forEvent:] + 119
    9   UIKit                               0x003aa799 -[UIControl sendAction:to:forEvent:] + 67
    10  UIKit                               0x003acc2b -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
    11  UIKit                               0x003ab7d8 -[UIControl touchesEnded:withEvent:] + 458
.............

..........
.............
)
terminate called after throwing an instance of 'NSException'

Где я могу начать решать эту проблему?

3 ответа

Решение

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

Ошибка ясно говорит, что не так. Я бы осмотрел твои numberOfRowsInSection метод. Вы должны учитывать, что строка удаляется. Вы не можете всегда возвращать одинаковое количество строк. Если вы удаляете одну строку из таблицы, ваш numberOfRowsInSection должен возвращать свое старое возвращаемое значение минус 1.

Например:

Допустим, я использую массив строк для заполнения таблицы;

Мой метод numberOfRowsInSection будет использовать

return [array count];

Мой метод cellForRowAtIndexPath будет использовать

cell.textLabel.text = (NSString*)[array objectAtIndex:indexPath.row];

Когда я удаляю строку (скажем, номер строки 3) из tableView, я также удаляю объект из массива:

[array removeObjectAtIndex:3];

Таким образом, когда numberOfRowsInSection вызывается снова, массив на один объект меньше, а numberOfRowsInSection возвращает на одно число меньше, чем раньше, что объясняет удаленную строку.

Вы прочитали сообщение об ошибке? Это говорит:

причина: "Неверное обновление: неверное количество строк в разделе 1.

Итак... количество строк в вашем tableView теперь неверно. Зачем?

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

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

Вы удаляете элемент из своего источника данных в commitEditingStyle:? Если источник данных таблицы имеет 2 элемента, и вы удаляете строку в commitEditingStyle: вам также следует удалить элемент из вашего источника данных, чтобы теперь и у таблицы, и у источника данных был 1 элемент.

Другие вопросы по тегам