uitableviewcontroller tutorial example cellforrowat iphone uitableview

iphone - tutorial - UITableView desplaza hacia abajo para ver la animación de inserción



uitableview tutorial swift 4 (7)

Tengo un UITableView al que estoy agregando una fila con una animación (usando insertRowsAtIndexPaths:withRowAnimation: . Todo esto es bueno siempre que la tabla no sea más larga que la pantalla.

Si es más grande que la pantalla, estoy intentando desplazarme hacia la parte inferior, pero no está funcionando como deseo. Si me desplazo a la nueva fila después de agregarla, pierdo la animación. Si intento desplazarme a esa indexPath antes de agregarla, se genera una excepción (ya que no es una indexPath válida)

¿Hay una solución a esto que no sea agregar una fila en blanco?


  1. Actualizar fuente de datos
  2. Insertar fila en la parte inferior
  3. Desplácese hasta la parte inferior

Ejemplo:

YOUR_ARRAY.append("new string") tableView.insertRows(at: [IndexPath(row: YOUR_ARRAY.count-1, section: 0)], with: .automatic) tableView.scrollToRow(at: IndexPath(row: YOUR_ARRAY.count-1, section: 0), at: UITableViewScrollPosition.bottom, animated: true)


Esto funciona para mi Sin embargo, en lugar de insertar una fila, solo la resalto (desvaneciéndola). Sin embargo, el principio es el mismo.

if let definiteIndexPath = indexPathDelegate.getIndexPath(toDoItem) { UIView.animateWithDuration(0.5, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { self.tableView.scrollToRowAtIndexPath(definiteIndexPath, atScrollPosition: .Middle, animated: false) }, completion: { (finished: Bool) -> Void in // Once the scrolling is done fade the text out and back in. UIView.animateWithDuration(5, delay: 1, options: .Repeat | .Autoreverse, animations: { self.tableView.reloadRowsAtIndexPaths([definiteIndexPath], withRowAnimation: UITableViewRowAnimation.Fade) }, completion: nil) }) }


Más en general, para desplazarse hasta la parte inferior:

NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([self.table numberOfRowsInSection:([self.table numberOfSections] - 1)] - 1) inSection:([self.table numberOfSections] - 1)]; [self.table scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];


Otras técnicas, incluidas las mencionadas en esta pregunta, no funcionaron para mí. Esto hizo sin embargo:

  1. Agregue el nuevo elemento a la colección interna de dataSource.
  2. Establecer una bandera en el elemento que indica que es "nuevo". Forzar la visualización de la celda para que no muestre nada cuando se establece este indicador.
  3. Inmediatamente llame a tableView: reloadData:
  4. Ahora el nuevo elemento está en esta tabla pero aparecerá visualmente vacío (debido a la bandera).
  5. Verifique si este nuevo elemento es visible usando tableView.indexPathsForVisibleRows.
  6. Si el elemento estaba en la pantalla, de inmediato, coloque ese indicador "nuevo" en el elemento dataSource en NO y llame a tableView: reloadRowsAtIndexPaths con un conjunto de animación. Ahora aparecerá como si este artículo se acaba de agregar. (has terminado en este caso)
  7. Si no estaba en la pantalla, desplácelo a la vista con tableView: scrollToRowAtIndexPath: pero no llame inmediatamente a reloadRowsAtIndexPath ...
  8. Maneje el mensaje (void) scrollViewDidEndScrollingAnimation : y haga lo mismo reloadRowsAtIndexPath desde el paso 6. Sospecho que este método se llama en cualquier momento que ocurre el desplazamiento, por lo que tendrá que detectar cuándo se llama desde el paso 7 y cuándo se llama porque el usuario está desplazándose .

Trabajé esta técnica (y escribí esta respuesta) cuando comencé el desarrollo de iOS, pero esto funcionó a largo plazo.


Recuerde hacer esto en el hilo principal, de lo contrario no se desplazará a la posición requerida.


Sí, hay una solución sin agregar una fila en blanco.

Nota: En el código, considero que solo hay 1 sección pero muchas filas. Puede modificar el código para administrar varias secciones también.

- (void)theMethodInWhichYouInsertARowInTheTableView { //Add the object in the array which feeds the tableview NSString *newStringObject = @"New Object"; [arrayWhichFeeds addObject:newStringObject]; [myTableView beginUpdates]; NSArray *paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:([arrayWhichFeeds count] - 1) inSection:0]]; [myTableView insertRowsAtIndexPaths:paths withRowAnimation:NO]; [myTableView endUpdates]; [myTableView reloadData]; [myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([arrayWhichFeeds count] - 1) inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES]; }


Tuve el mismo problema. Aquí estaba mi solución.

Primero - Actualice su fuente de datos

Segundo -

NSIndexPath *path = [NSIndexPath indexPathForRow:([arrayWhichFeeds count] - 1 inSection:0]]; NSArray *paths = [NSArray arrayWithObject:path]; [myTableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationTop]; [myTableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionBottom animated:YES];

* Tenga en cuenta que esto NO ESTÁ [tableView beginUpdades] en el [tableView beginUpdades] y [tableView endUpdates] . Si lo haces no funcionará como deseas.

Pruébelo, debería animarse en las nuevas filas desde la parte inferior mientras se desplaza hacia ellas.