UITableView deleteRowsAtIndexPath когда обновлять модель? - PullRequest
1 голос
/ 06 января 2011

Я реализую метод для удаления строки из моего табличного представления на основе объекта домена, но я получаю ошибку после вызова deleteRowsAtIndexPath: animated

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

Поэтому я подумал: «Хорошо, я обновляю модель слишком рано».Код:

    - (void)deleteItem:(Item *)item {
    NSInteger index = [items indexOfObject:item]; // items is the model a NSArray
    if (index != NSNotFound) {
        NSMutableArray *itemEditable = [items mutableCopy];
        [itemEditable removeObjectAtIndex:index];
        self.items = itemEditable; 

        NSIndexPath *indexToDelete = [NSIndexPath indexPathForRow:index inSection:0];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexToDelete] withRowAnimation:UITableViewRowAnimationMiddle];
    }
}

И затем я изменяю код для обновления модели после Я вызываю deleteRowsAtIndexPath: animated

    - (void)deleteItem:(Item *)item {
    NSInteger index = [items indexOfObject:item]; // items is the model a NSArray
    if (index != NSNotFound) {
        NSIndexPath *indexToDelete = [NSIndexPath indexPathForRow:index inSection:0];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexToDelete] withRowAnimation:UITableViewRowAnimationMiddle];

        NSMutableArray *itemEditable = [items mutableCopy];
        [itemEditable removeObjectAtIndex:index];
        self.items = itemEditable; 

    }
}

Но это не помогло,изменяется только число строк в сообщении об ошибке от 2 до 3.

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

Где обновить модель?


Добавлен метод numberOfRowsInSection

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [items count];
}

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Я нашел проблему. Свойство setter of items реализовано так, чтобы вызывать reloadData, и это приводило к путанице.

-(void) setItens:(NSMutableArray *)newItens{
    if (itens != nil) {
        [itens release];
        itens = nil;
    }
    itens = [newItens copy];
//  [tableView reloadData]; // WRONG don't do this
}

Это второй раз, когда я обнаружил, что я делал неправильно, сразу после публикации вопроса здесь. Я надеюсь, что это поможет кому-то однажды. Спасибо aBitObvious, теперь я aBitShy:)

0 голосов
/ 07 января 2011

Я думаю, что после удаления строки необходимо перезагрузить ее чуть ниже удаленной строки:

Я имею в виду,

- (void)deleteItem:(Item *)item 
{
      .......................your code..............

   [tableView reloadData];
}

Попробуйте, это должно работать.

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