Это довольно просто, если вы используете NSFetchedResultsController для своего табличного представления. С этим вы можете реализовать методы протокола NSFetchedResultsControllerDelegate в вашем контроллере представления vc1:
– controllerWillChangeContent:
– controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
– controller:didChangeSection:atIndex:forChangeType:
– controllerDidChangeContent:
Таким образом, когда вы сохраняете изменения в вашем managedObjectContext в viewcontroller vc2, автоматически генерируется событие hasChanges
, уведомляющее fetchedResultsController, и fetchedResultsController выполняет эти методы делегата. Ваша таблица будет автоматически обновляться с изменениями, используя код в ваших методах делегата. В вашем случае, я думаю, вы сосредоточены на методе controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
, где тип изменения - NSFetchedResultsChangeUpdate
.
Если это тип обновления, вы можете просто настроить ячейку на indexPath
так же, как вы делаете это в методе tableView insertRowsAtIndexPaths:withRowAnimation:
. Конечно, в этом случае ячейка уже находится в таблице, поэтому вы не вставляете ее, а переконфигурируете.
Вы будете заключать в скобки методы делегата с помощью 1controllerWillChangeContent: and 1controllerDidChangeContent:
, содержащего вызовы [tableView beginUpdates];
и [tableView endUpdates]
соответственно (где tableView
заменяется ссылкой на ваш объект tableView). Они сохраняют радость fetchedResultsController и tableView во время внесения изменений, и вы не получите никаких ошибок, связанных с их несинхронизацией. (Вероятно, это не большая проблема, если вы меняете только содержимое ячейки.)
Я найду вам пример, когда вернусь в свой офис и выложу его здесь. Я сделал это в выходные на проекте, с которым я работаю, и это решило много проблем.