iPhone-App аварийно завершает работу при удалении строки UITableView - PullRequest
2 голосов
/ 03 июня 2011

У меня есть 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

Завершение работы приложения из-за невыполненного исключения «Обновление NSInternalInconsidence:: недопустимое количество строк в разделе 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 ]

4 голосов
/ 03 июня 2011

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

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

Например:

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

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

return [array count];

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

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

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

[array removeObjectAtIndex:3];

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

2 голосов
/ 03 июня 2011

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

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

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

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

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

1 голос
/ 03 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...