2013-05-06 5 views
3

У меня есть UITableView, который заполняется NSFetchedResultsController. Когда пользователь перемещает элемент справа у меня есть кнопка Удалить появляющуюся, чтобы он/она может удалить объект, используя следующий подход:Удалить из UITableView с помощью NSFetchedResultsController

// Override to support conditional editing of the table view. 
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
// Return NO if you do not want the specified item to be editable. 
    return YES; 
} 

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES; 
} 


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

if (editingStyle == UITableViewCellEditingStyleDelete) { 
    //perform similar delete action as above but for one cell 

    XMPPUserCoreDataStorageObject *user = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 

    NSLog(@"User delete: %@", [user displayName]); 

    //delete from fetchController 
    NSArray *sections = [[self fetchedResultsController] sections]; 
    int userStatus = [[user sectionNum] intValue]; 


    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 

    } 
} 

Но когда я делаю, что есть исключение, потому что я не обновляя модель, которая является моим fetchedResultsController. Вопрос в том, как удалить из fetchedController с помощью indexPath, который у меня есть с commitEditingStyle?

ответ

7

Поскольку вы используете NSFetchedResultsController, вам нужно только удалить объект из контекста, и он заберет изменение и удалит строки для вас.

Так удалить deleteRowsAtIndexPaths: линию и вызовите вместо этого:

[self.fetchedResultsController.managedObjectContext deleteObject:user]; 
+0

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

+3

@ user1845360: Вы должны удалить объект, но вы должны * не вызывать * 'deleteRowsAtIndexPaths'. Это делается позже в методах делегатов FRC. –

+0

@MartinR хороший момент, я обновлю свой ответ. –

1

Посмотрите на эту Answer, что вы должны сделать, это удалить NSManagedObject из базы данных, а также от NSFetchedResultsController.

Смежные вопросы