Les docs pour NSFetchedResultsControllerDelegate fournissent le code exemple suivantLe comportement 'ChangeUpdate' de NSFetchedResultsControllerDelegate est-il rompu?
- (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;
}
}
Lorsque je crée une nouvelle NSManagedObject, NSFetchedResultsChangeInsert feux (grands!). Lorsque je modifie la valeur d'un attribut (utilisé pour le titre de la cellule), les incendies NSFetchedResultsChangeUpdate. Malheureusement, le nouveau titre ne s'affiche pas automatiquement à moins de recharger le tableau, la section ou la rangée. En effet, si le nouveau nom provoque un tri différent du jeu de résultats, alors NSFetchedResultsChangeMove se déclenche et tout va bien puisque le code fourni recharge toute la section.
UITableView a une méthode reloadRowsAtIndexPaths: withRowAnimation donc j'essayé d'utiliser ce sous le bloc de code NSFetchedResultsChangeUpdate. Il ne fonctionne en effet ... mais la documentation de cette méthode spécifique lu comme si je ne pas besoin (notez la dernière ligne):
Rechargement une ligne provoque l'affichage du tableau pour demander sa source de données pour une nouvelle cellule pour cette ligne. La table anime cette nouvelle cellule alors qu'elle anime l'ancienne ligne. Appelez cette méthode si vous souhaitez alerter l'utilisateur que la valeur d'une cellule est en train de changer. Si, cependant, notifiant l'utilisateur n'est pas important-c'est-à-dire, vous voulez juste changer la valeur qu'une cellule est affichage-vous pouvez obtenir la cellule pour une ligne particulière et définir sa nouvelle valeur.
Et oui, si je me connecte ce qui se passe, quand
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
obtient invoquaient sur une NSFetchedResultsChangeUpdate, il est en mesure de récupérer la dernière valeur « nom » et le mettre dans Textlabel de la cellule . Le nom n'est simplement rendu dans la cellule que si je le recharge. Même si je clique simplement sur la cellule, le nom apparaît. Notez que pour recréer ce comportement, vous devez créer un nouvel objet géré et ensuite lui donner un nom qui l'amène à trier FIRST dans le NSFetchedResultsController. De cette façon, le NSFetchedResultsChangeMove ne se déclenche pas (ce qui fonctionne car il recharge la section).
Ai-je manqué quelque chose ou est ce comportement attendu? La 'discussion' pour reloadRowsAtIndexPaths m'amène à croire que je devrais être capable de simplement définir textLabel de la cellule sans recharger la ligne, section ou table.
Cela devrait être rking. Je fais la même chose. Pour les modifications apportées aux attributs, lorsque save: est appelé, les notifications MOC disparaissent. NSFetchedResultsController voit la modification et appelle ma méthode configureCell: atIndexPath. Là, j'attrape les valeurs et remplis la cellule, et la cellule est mise à jour immédiatement. Postez votre code configureCell. –