2010-06-19 10 views
9

Tengo un pequeño problema con mi UITableViewController o NSFetchedResultsController. No estoy seguro de cuál es el problema, pero supongo que es el UITableViewController.Cómo actualizar un UITableViewController o NSFetchedResultsController?

Como ya he dicho uso un NSFetchedResultsController para llenar mis datos en un UITableViewController. Los datos están ordenados por fecha y también se muestran en secciones por fecha-año, p. Mayo de 2010/junio de 2010/y así sucesivamente. Esto se muestra como el encabezado de la sección.

Ahora cuando agrego nuevos datos, se utiliza automáticamente la fecha actual como predeterminada, pero si quiero usar una fecha, que no está actualmente en la lista de la sección, por ejemplo, Abril de 2010 (actualmente mayo y junio en la lista), entonces esto no se muestra correctamente. Solo cuando salga de la aplicación y la vuelva a iniciar, mostrará los encabezados de las nuevas secciones y todo estará bien.

Así que de alguna manera necesito poder actualizar mi lista o actualizarla. Simplemente al agregarlo al contexto y cambiarlo no parece actualizarlo.

Una vez más, no estoy seguro de lo que necesito para actualizar, si es mi objeto NSFetchedResultsController o la UITableViewController.

ACTUALIZACIÓN # 1:

simplemente me di cuenta de que hay una excepción en este método:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates. 
    [self.tableView endUpdates]; 

} 

Aquí es donde me muevo los datos:

- (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]; 
      // Reloading the section inserts a new row and ensures that titles are updated appropriately. 
      [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 

} 

Este método es bastante muy tomado del ejemplo de CoreDataBooks de Apple. Y este es el error:

Error de aplicación grave. Un excepción fue capturado por el delegado de NSFetchedResultsController durante una llamada a -controllerDidChangeContent :. *** - [NSMutableArray removeObjectAtIndex:]: Índice 1 más allá de los límites [0 .. 0] con userInfo (nulo)

Y después de eso, el modo de edición (donde aparece el botón de borrar) no funciona nunca más.

Gracias.

Respuesta

0

que necesita para implementar los métodos controller:didChangeSection:atIndex:forChangeType: delegado. En él, envíe los mensajes insertSections:withRowAnimation:, deleteSections:withRowAnimation: y reloadSections:withRowAnimation: a su vista de tabla dependiendo del tipo de cambio informado.

+0

eso es lo que he añadido en la pregunta ..., a excepción viene después de eso. – elementsense

+0

Ni siquiera está mencionando 'controller: didChangeSection: atIndex: forChangeType:'. –

+0

isnt -controller: didChangeObject: atIndexPath: forChangeType: newIndexPath haciendo lo mismo? – elementsense

15

Ok, parece que he encontrado una solución, simplemente omitir estos

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 

y siempre hago esto.

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 

[self.tableView reloadData]; 

} 

que, obviamente, esto dará un poco más de la lógica, ya que el problema sólo occures cuando quiero mover mis datos en una sección que no existía antes. Hasta que alguien pueda darme una solución real, iré con esta.

+3

Hablé con un ingeniero de Apple en la WWDC sobre esto. Dijo que esto era un error en UITableView (que se ha corregido en 4.0). Si estás en <4.0, simplemente llama a 'reloadData' así. Si está en> = 4.0, hágalo como dice la documentación. –

+0

gracias, funcionan a la perfección .. – tesmojones

+1

Usted, señor, acabo de resolver un problema que sangraba en su sexta hora. Si pudiera votar dos veces, lo haría. – Cyprus106

2

Adoptando la solución de Apple en iPhoneCoreDataRecipes en la versión 1.2, lo más apropiado que hacer es sustituir

// Reloading the section inserts a new row and ensures that titles are updated appropriately. 
[tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 

con

[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 

(FileMerge es tu amigo!)

Nota, no hay otra solución en la versión 1.2 que impide estrellarse errática cuando se crea nuevas entradas. Lo había informado y lo arreglaron en dos semanas. Te animo a que informes de errores con Apple. Son mucho más receptivos de lo que piensas, y puedes esperar obtener la mejor solución posible.

Cuestiones relacionadas