Сбой приложения с ошибкой SIGABRT при попытке удалить строку в tableView - PullRequest
1 голос
/ 09 марта 2012

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

Вот мой код для удаления:

- (void) tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
forRowAtIndexPath:(NSIndexPath *)indexPath
{
  if (editingStyle == UITableViewCellEditingStyleDelete)
  {
    [[self displayedObjects] removeObjectAtIndex:[indexPath row]];


    //  Animate deletion
    NSArray *indexPaths = [NSArray arrayWithObject:indexPath];
    [[self tableView] deleteRowsAtIndexPaths:indexPaths
                            withRowAnimation:UITableViewRowAnimationFade];
    //[[self tableView] deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]];
  }
}

Ответы [ 4 ]

1 голос
/ 17 марта 2012

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

0 голосов
/ 09 марта 2012

Я сравнил с моим кодом, чтобы увидеть, где вы ошиблись.

        //Removes From Table
    [favorites removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:[NSMutableArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];

Избранное - мой массив.Я думаю, вам нужно изменить эту строку:

   [[self displayedObjects] removeObjectAtIndex:[indexPath row]];

Сначала поместите эту строку непосредственно перед этой:

[[self tableView] deleteRowsAtIndexPaths:indexPaths
                            withRowAnimation:UITableViewRowAnimationFade];

А затем измените selfна имя вашего массива, который отображается в таблице.

ТАКЖЕ!ОЧЕНЬ ВАЖНО

Убедитесь, что отображаемый в таблице массив представляет собой NSMutableArray НЕ NSArray

С NSArray вы не можете изменить (добавить или удалить)ценности.Однако, с NSMutableArray вы можете, поэтому убедитесь, что вы не отображаете NSArray

0 голосов
/ 09 марта 2012

Если я не ошибаюсь, вы звоните по этому коду:

 [[self tableView] deleteRowsAtIndexPaths:indexPaths
                            withRowAnimation:UITableViewRowAnimationFade];

из совершенного события удаления. Я считаю, что все, что вам нужно сделать, это обновить хранилище резервных копий из метода "tableView: commitEditingStyle: forRowAtIndexPath:" Удаление уже зафиксировано. После этого вам также может понадобиться обновить представление таблицы, а также пометить представление таблицы как разрешающее обновления.

Попробуйте закомментировать весь этот код и скажите нам, что происходит:

//  Animate deletion
NSArray *indexPaths = [NSArray arrayWithObject:indexPath];
[[self tableView] deleteRowsAtIndexPaths:indexPaths
                        withRowAnimation:UITableViewRowAnimationFade];
0 голосов
/ 09 марта 2012

Охватывает ли ваш [self displayedObjects] счетчик предметов [indexPath row]?Например, у вашего [self displayedObjects] есть только 5 предметов, но вы хотите removeObjectAtIndex:6.

...