ios - Recordando la posición de desplazamiento en UITableView
uiviewcontroller reloaddata (7)
Tengo un pequeño problema con mi aplicación de iOS en xcode. Tengo una UITableView que carga unos cientos de celdas. Cuando me desplazo hacia abajo a una celda específica y navego hacia abajo para ver los controladores detallados y regreso de nuevo, la tabla de vista maestra ha regresado a la cima. He echado un vistazo a las siguientes 2 preguntas que son similares.
¿Cómo puedo obtener la posición de desplazamiento UITableView para poder guardarlo?
Configuración de la posición de desplazamiento en UITableView
Todavía no puedo hacer que funcionen. No soy el codificador más experimentado, así que estoy luchando con esto.
Sé que hay que cambiar cosas como viewWillDisappear y viewDidAppear, pero realmente no puedo ir mucho más allá.
En esta tabla tengo una función reloadData por lo que es posible desplegar los últimos datos del servidor y también una barra de búsqueda en funcionamiento.
De todos modos, una mano amiga sería genial. Gracias,
Luke
Como se mencionó en otros comentarios, desplazarse hacia arriba en la navegación Atrás en un UINavigationController no es el comportamiento predeterminado.
Otra causa podría ser que está configurando una celda cerca de la parte superior de la tabla como primera respuesta en la vista Aparecerá, por ejemplo, un cuadro de búsqueda o un campo de edición cerca de la parte superior de la tabla. UITableViewController desplazará un primer respondedor a la vista automáticamente, lo cual es bueno. Mientras eso es lo que estás tratando de hacer. :) Tenga cuidado de no establecer la primera respuesta en viewWillAppear a menos que eso sea lo que desea. Cheers, AZ
Mi decisión para una colección:
CGFloat oldCollectionViewHeight = self.messageCollectionView.contentSize.height;
[self.messageCollectionView reloadData];
[self.messageCollectionView layoutIfNeeded];
CGFloat newCollectionViewHeight = self.messageCollectionView.contentSize.height;
if (oldCollectionViewHeight) {
self.messageCollectionView.contentOffset = CGPointMake(0, newCollectionViewHeight - oldCollectionViewHeight);
}
Para la mesa, el principio es el mismo.
Mi solución a este problema consistió en desplazar la tabla al índice del último elemento.
private func scrollToItem(item:Int, section:Int bottom:Bool = true, animated:Bool = false) {
let indexPath = NSIndexPath(forRow: item:Int-1, inSection: section)
var position = UITableViewScrollPosition.Bottom
if (!bottom) { position = UITableViewScrollPosition.Top }
self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: position, animated: animated)
}
Ordenado
Con un poco de inspiración de Desdenova, mientras estaba en el trabajo, lo pensé bien y me di cuenta de lo que podría ser. Recordando que tenía una barra de búsqueda, había implementado el siguiente código hace unos meses para ocultarlo:
[self.tableView setContentOffset:CGPointMake(0,-20) animated:NO];
En ingenuidad puse eso en viewDidAppear
en lugar de viewDidLoad
. Obviamente, esto ocultó la barra de búsqueda, pero al estar en el comando void incorrecto lo hacía cada vez que masterDetailView volvía a la parte superior de la pila. Entonces, después de mover el código anterior a viewDidLoad, ahora todavía lo oculta, pero solo la vez.
¡Simplemente lo deletreo de esta manera para otros principiantes, como yo, que pueden encontrarse con el mismo problema y salvar su cordura!
Gracias a todos por sus ideas que me ayudaron.
+1 a todos ustedes!
Por alguna razón, esto fue a mitad de camino para mí (a veces la posición sería solo aproximada). Finalmente utilicé la siguiente solución a priori menos limpia
NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0];
[self.tableView scrollToRowAtIndexPath:self.firstVisibleIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
self.firstVisibleIndexPath = firstVisibleIndexPath;
que funcionó mejor.
Si alguien se pregunta, probé la solución de Prashant N y funcionó. Sin embargo, reloadData
realidad no restablece la posición de desplazamiento ahora, así que no tuve que hacer nada más que reloadData
.
Vea aquí primero tiene que guardar la posición desplazada de tableView
ie contentOffset
de tableView
y luego reutilizarlo cuando regrese a tableView
.
1) Cuándo y dónde lo guardarás:
Cuándo : en el punto, cuando está detailViewController
guarde el contentOffset
de tableView
Cómo : float verticalContentOffset = tableView.contentOffset.y;
2) ¿Cómo establecerás de nuevo tableView en la misma posición desplazada?
[tableView setContentOffset:CGPointMake(0, verticalContentOffset)];
Espero que esto te ayudará.