la documentación para NSFetchedResultsControllerDelegate proporcionan el código de ejemplo¿Se ha roto el comportamiento NSFetchedResultsControllerDelegate 'ChangeUpdate'?
- (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;
}
}
Cuando creo un nuevo NSManagedObject, NSFetchedResultsChangeInsert incendios (grandes!). Cuando cambio el valor de un atributo (utilizado para el título de la celda), se activa el NSFetchedResultsChangeUpdate. Desafortunadamente, el nuevo título no se muestra automáticamente a menos que vuelva a cargar la tabla, sección o fila. De hecho, si el nuevo nombre hace que el conjunto de resultados se ordene de manera diferente, entonces se activa NSFetchedResultsChangeMove y todo está bien, ya que el código provisto vuelve a cargar toda la sección.
UITableView tiene un método reloadRowsAtIndexPaths: withRowAnimation así que intentaron usar este bajo el bloque de código NSFetchedResultsChangeUpdate. Se trabaja de hecho ... pero la documentación para este método específico leer como si yo no lo necesito (nótese la última línea):
volver a cargar una fila hace que la vista mesa para preguntar su fuente de datos para una nueva celda para esa fila. La tabla anima esa nueva celda en la que anima la fila anterior. Llame a este método si desea alertar al usuario de que el valor de una celda está cambiando. Si, no obstante, notificar al usuario no es importante, es decir, solo desea cambiar el valor que muestra una celda ; puede obtener la celda para una fila particular y establecer su nuevo valor.
Y sí, si me conecto lo que está sucediendo, cuando
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
se invoca en una NSFetchedResultsChangeUpdate, es capaz de recuperar el último valor 'nombre' y ponerlo en textLabel de la célula . El nombre simplemente no está renderizando en la celda a menos que lo vuelva a cargar. Incluso si simplemente hago clic en la celda, aparece el nombre. Tenga en cuenta que para volver a crear este comportamiento, debe crear un nuevo objeto administrado y luego darle un nombre que haga que clasifique FIRST en NSFetchedResultsController. De esta forma, NSFetchedResultsChangeMove no se activa (lo que funciona, ya que vuelve a cargar la sección).
¿Falta algo o me gusta? La 'discusión' de reloadRowsAtIndexPaths me lleva a pensar que debería ser capaz de simplemente configurar la etiqueta de texto de la celda sin volver a cargar la fila, la sección o la tabla.
Esto debería ser wo rking. Estoy haciendo lo mismo. Para cambios en los atributos, cuando se llama a save: las notificaciones de MOC se apagan. NSFetchedResultsController ve el cambio y llama a mi método configureCell: atIndexPath. Ahí agarré los valores y llené la celda, y la celda se actualiza de inmediato. Publica tu código de configureCell. –