Configuración de la posición de desplazamiento en UITableView

Tengo una aplicación que funciona de manera similar a cómo funciona la aplicación de contacto de iPhone. Cuando agregamos un nuevo usuario de contacto se dirige a una pantalla de solo vista con información de contacto. Si seleccionamos “Todos los contactos” en la barra de navegación, el usuario se desplaza a la lista de todos los contactos donde el contacto recientemente agregado está a la vista.

Podemos mover la vista a una fila en particular usando:

[itemsTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionBottom]; 

… pero no está funcionando. Llamo esto justo después de llamar:

  [tableView reloadData]; 

Creo que no se supone que debo llamar al método selectRowAtIndexPath:animated:scrollPosition aquí. Pero si no está aquí, ¿dónde?

¿Hay algún método de delegado que se llame después del siguiente método?

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

Creo que tengo una aplicación similar: una lista de elementos., Toque ‘+’ -> nueva pantalla, regrese y vea la lista actualizada, desplazada para mostrar el elemento agregado en la parte inferior.

En resumen, pongo reloadData en viewWillAppear:animated: y scrollToRowAtIndexPath:... en viewDidAppear:animated:

 // Note: Member variables dataHasChanged and scrollToLast have been // set to YES somewhere else, eg when tapping 'Save' in the new-item view. - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (dataHasChanged) { self.dataHasChanged = NO; [[self tableView] reloadData]; } else { self.scrollToLast = NO; // No reload -> no need to scroll! } } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if (scrollToLast) { NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([dataController count] - 1) inSection:0]; [[self tableView] scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; } } 

Espero que esto ayude. Si agrega algo en el medio de la lista, puede desplazarse fácilmente a esa posición.

Puedes probar esto, mi aplicación de alguna manera similar a ti cuando hago clic en un botón de desplazamiento de uitableview está arriba.

 [tableviewname setContentOffset:CGPointMake(0, ([arrayofcontact count]-10)*cellheight) animated:YES]; 

10 es la cantidad de celdas que desea desplazarse hacia arriba

Espero que esto te ayudará:-)

La animación de desplazamiento es inevitable cuando la compensación se establece desde viewDidAppear(_:) . Un mejor lugar para establecer el desplazamiento de desplazamiento inicial es viewWillAppear(_:) . Tendrá que forzar el diseño de una vista de tabla, porque su tamaño de contenido no está definido en ese punto.

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) tableView.setNeedsLayout() tableView.layoutIfNeeded() if let selectedIndexPath = selectedIndexPath, tableView.numberOfRows(inSection: selectedIndexPath.section) > 0 { tableView.scrollToRow(at: selectedIndexPath, at: .top, animated: false) } } 

¿Tiene suficientes contactos ficticios para probar el desplazamiento? Parece que solo cuando su tablaView es de un cierto tamaño, el iPhone encuentra el inputus para desplazarse.

Este es el código que funciona para mí en mi proyecto. Utilizo un botón anterior y, por lo tanto, desplazo la vista de tabla un poco más hacia abajo que usualmente iría con UITABLEVIEWSCROLLPOSITION. (mi botón anterior no funcionará si no puede “ver” la celda anterior.

Ignore algunas de las llamadas a métodos personalizados.

 - (void)textFieldDidBeginEditing:(UITextField *)textField { //Show the navButtons [self navButtonAnimation]; DetailsStandardCell *cell = (DetailsStandardCell *)textField.superview.superview.superview; self.parentController.lastCell = cell; //Code to scroll the tableview to the previous indexpath so the previous button will work. NOTE previous button only works if its target table cell is visible. NSUInteger row = cell.cellPath.row; NSUInteger section = cell.cellPath.section; NSIndexPath *previousIndexPath = nil; if (cell.cellPath.row == 0 && cell.cellPath.section != 0) //take selection back to last row of previous section { NSUInteger previousIndex[] = {section -1, ([[self.sections objectForKey:[NSNumber numberWithInt:section - 1]]count] -1)}; previousIndexPath = [[NSIndexPath alloc] initWithIndexes:previousIndex length:2]; } else if (cell.cellPath.row != 0 && cell.cellPath.section != 0) { NSUInteger previousIndex[] = {section, row - 1}; previousIndexPath = [[NSIndexPath alloc] initWithIndexes:previousIndex length:2]; } [self.theTableView scrollToRowAtIndexPath: cell.cellPath.section == 0 ? cell.cellPath : previousIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; }