¿La mejor manera de seleccionar una fila después de insertla?

Estoy trabajando en una aplicación para iOS usando la plantilla CoreData basada en navigation. Me gustaría seleccionar y "desplazar a visible" una fila después de que se insertó en la vista de la tabla . Idealmente, me gustaría seleccionarlo, desmarcarlo y seleccionarlo nuevamente, para get una especie de efecto de destello.

Como estoy usando el método, que la plantilla provea, a saber:

#pragma mark - Fetched results controller delegate - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { [self.tableView beginUpdates]; } - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { switch(type) { case NSFetchedResultsChangeInsert: [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; break; case NSFetchedResultsChangeDelete: [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; break; } } - (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:UITableViewRowAnimationTop]; [self.tableView selectRowAtIndexPath:newIndexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle]; 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 insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade]; break; } } - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { [self.tableView endUpdates]; } 

Estoy un poco confundido y no sé, dónde poner ese código de selección.
Si pongo un
[tableView selectRowAtIndexPath:<#(NSIndexPath *)#> animated:<#(BOOL)#> scrollPosition:<#(UITableViewScrollPosition)#>]
dentro
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller ,
selecciona la fila, pero la deselecciona de inmediato y el desplazamiento no se comporta como debería hacerlo.

en el controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: método controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: cambia esta sección:

 case NSFetchedResultsChangeInsert: [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; [tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; insertedIndexPath = newIndexPath; //remember for selection break; 

y agregue el método de UIScrollViewDelegate:

 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { [self.tableView selectRowAtIndexPath:insertedIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; } 

Recuerde agregar la variable insertedIndexPath.

Solucioné un problema similar. Inserta el elemento al comienzo de la tabla y quería seleccionarlo justo después.

Paso 1. – Cree un interruptor para mantener el estado si debe seleccionar la primera fila

 @implementation MyTableViewController { BOOL _selectFirstRow; } 

Paso 2. – Pasar a SÍ al insert

 - (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]; _selectFirstRow = YES; break; 

Paso 3. – Crear un método para seleccionar la primera fila

 - (void) selectFirstTableRow { [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionTop]; } 

Paso 4. – Llamar al método para seleccionar la fila justo después de actualizar la tabla.

 - (void) controllerDidChangeContent:(NSFetchedResultsController *)controller { [self.tableView endUpdates]; if (_selectFirstRow) { [self selectFirstTableRow]; _selectFirstRow = NO; } } 

Eso es todo gente … si quieres seleccionar una fila diferente, también almacena el parámetro newIndexPath en la class. Eso es todo. Espero que te ayude. Cia!

Mayormente la misma respuesta que la anterior, pero con la location corregida de cuándo llamar a scrollToRowAtIndexPath

en el controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: método controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: cambia esta sección:

 case NSFetchedResultsChangeInsert: [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; //save new index path into your own ivar self.newlyInsertIndex = newIndexPath break; 

si usa el código FRC de la placa de caldera , no puede desplazarse al índice recién insertado hasta que las actualizaciones de la tabla hayan finalizado

Haga esto en el método - (void)controllerDidChangeContent:

  if (!self.changeIsUserDriven){ [self.tableView endUpdates]; if (self.newlyInsertedIndex){ //ScrollPositionNone == use least amount of effort to show cell [self.tableView scrollToRowAtIndexPath:self.newlyInsertedIndex atScrollPosition:UITableViewScrollPositionNone animated:YES]; //cleanup self.newlyInsertedIndex = Nil; } } 

y agregue el método de UIScrollViewDelegate:

 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { [self.tableView selectRowAtIndexPath:insertedIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; } 

restring agregar newInsertedIndex ivar

Todo esto no funcionó para mí. Lo que hice fue:

  • cuando creo un nuevo object, lo recuerdo en una variable de instancia _newInstance
  • cuando se guarda el object o se cancela la creación, lo _newInstance = nil; : _newInstance = nil;
  • en controllerDidChangeObject , selecciono la fila:

     - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { [self.tableView endUpdates]; if (_newObject) { NSIndexPath *ip = [self.fetchedResultsController indexPathForObject:_newObject]; [self.tableView selectRowAtIndexPath:ip animated:YES scrollPosition:UITableViewScrollPositionMiddle]; } }