La documentazione per NSFetchedResultsControllerDelegate fornire il seguente codice di esempioIl comportamento di NSFetchedResultsControllerDelegate 'ChangeUpdate' è rotto?
- (void)controller:(NSFetchedResultsController *)controller
didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
Quando creo un nuovo NSManagedObject, NSFetchedResultsChangeInsert incendi (grandi!). Quando cambio il valore di un attributo (utilizzato per il titolo della cella), viene attivato lo NSFetchedResultsChangeUpdate. Sfortunatamente, il nuovo titolo non viene visualizzato automaticamente a meno che non ricarichi la tabella, la sezione o la riga. Infatti, se il nuovo nome fa sì che il set di risultati sia ordinato in modo diverso, allora gli spari NSFetchedResultsChangeMove si attivano e tutto procede bene poiché il codice fornito ricarica l'intera sezione.
UITableView ha un metodo reloadRowsAtIndexPaths: withRowAnimation quindi provato utilizzando questo sotto il blocco di codiceNSFetchedResultsChangeUpdate. E 'effettivamente funziona ... ma la documentazione di questo metodo specifico letto come se io non ne ho bisogno (notate l'ultima riga):
ricaricamento di fila fa sì che la vista tavolo per chiedere la sua fonte di dati per una nuova cella per quella riga. La tabella anima quella nuova cella in quanto anima la riga precedente. Chiamare questo metodo se si desidera avvisare l'utente che il valore di una cella sta cambiando. Se, tuttavia, la notifica all'utente non è importante, vale a dire che si desidera modificare il valore di una cella è visualizzazione-è possibile ottenere la cella per una riga particolare e impostare il suo nuovo valore.
E sì, se accedo ciò che sta accadendo, quando
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
viene invocata su un NSFetchedResultsChangeUpdate, è in grado di recuperare il valore più recente 'nome' e metterlo in textLabel della cellula . Il nome non viene semplicemente visualizzato nella cella a meno che non lo ricarichi. Anche se faccio semplicemente clic sulla cella, compare il nome. Si noti che per ricreare questo comportamento, è necessario creare un nuovo oggetto gestito e quindi dargli un nome che lo induca a ordinare PRIMO in NSFetchedResultsController. In questo modo, NSFetchedResultsChangeMove non viene attivato (il che funziona poiché ricarica la sezione).
Mi manca qualcosa o è questo comportamento previsto? La "discussione" per reloadRowsAtIndexPaths mi porta a credere che dovrei essere in grado di impostare semplicemente la textLabel della cella senza ricaricare riga, sezione o tabella.
Questo dovrebbe essere wo rking. Sto facendo la stessa cosa Per le modifiche agli attributi, quando si salva: viene chiamato, le notifiche MOC si spengono. NSFetchedResultsController vede la modifica e chiama il mio configureCell: metodo atIndexPath. Lì afferro i valori e riempio la cella, e la cella viene aggiornata immediatamente. Pubblica il tuo codice configureCell. –