2011-04-04 17 views
23

estoy tratando de conseguir un UITableView para ir a la parte superior de la página cuando vuelvo a cargar los datos de tabla cuando llamo lo siguiente de¿Cómo obtener una UITableview para ir al inicio de la página al volver a cargar?

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 

// A bunch of code … 

[TableView reloadData]; 
} 

En ese mismo sentido, también me gustaría ser capaz de ir a una sección específica cuando recargo los datos de la tabla.

He intentado colocar el siguiente, que parece aplicable solamente a la fila, antes y después de la recarga, pero no pasa nada:

[TableView scrollToRowAtIndexPath:0 atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

Respuesta

51

Ésta es otra manera que podía hacerlo:

Objective-C

[tableView setContentOffset:CGPointZero animated:YES]; 

Swift 3

tableView.setContentOffset(.zero, animated: true) 

Probablemente el camino a seguir más fácil y más recta para hacerlo.

+0

Gracias. Eso me llevó a la parte superior de la página, que era mi necesidad inmediata. – AppsToKnow

+1

A veces, esto debería ejecutarse después de un retraso de 0,1 segundos. p.ej. 'DispatchQueue.main.asyncAfter (fecha límite: .now() + 0.1, ejecutar: { tableView.setContentOffset (.zero, animated: false) }) ' –

4

UITableView es una subclase de UIScrollView, por lo que también se puede utilizar:

[mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES]; 
+0

Gracias. Intenté esto y funcionó bien, pero fui con el ejemplo a continuación. – AppsToKnow

14

para desplazarse a una sección específica, tiene que especificar la ruta del índice a la misma:

NSIndexPath *topPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
[TableView scrollToRowAtIndexPath:topPath 
       atScrollPosition:UITableViewScrollPositionTop 
         animated:YES]; 

Si no está seguro del número de filas en su tableView. Utiliza el siguiente:

NSIndexPath *topPath = [NSIndexPath indexPathForRow:NSNotFound inSection:0]; 
[TableView scrollToRowAtIndexPath:topPath 
       atScrollPosition:UITableViewScrollPositionTop 
         animated:YES]; 
+4

Probablemente debería asegurarse de que la fila exista en la tabla, de lo contrario generará una excepción. –

+0

Gracias por este código. Ya publiqué mi aplicación, pero quiero usar esto en mi primera actualización. – AppsToKnow

+0

@CameronSpickert Consulte la actualización de esa condición. –

0

Si se desplaza antes de volver a cargar y el número de filas disminuye, puede tener un comportamiento de animación extraño. Para asegurar el desplazamiento ocurre después de la recarga, utilizar un método como este:

- (void)reloadTableViewAndScrollToTop:(BOOL)scrollToTop { 
    [self.tableView reloadData]; 
    if (scrollToTop) { 
     [self.tableView setContentOffset:CGPointZero animated:YES]; 
    } 
} 
9

Después de leer todas las respuestas aquí y en otros lugares, finalmente encontré una solución que funciona de forma fiable y no muestra el desplazamiento después de los datos se cargan . Mi respuesta se basa en este post y mi observación de que se necesita un desplazamiento negativo si está utilizando inserciones de contenido:

func reloadAndScrollToTop() { 
    tableView.reloadData() 
    tableView.layoutIfNeeded() 
    tableView.contentOffset = CGPoint(x: 0, y: -tableView.contentInset.top) 
} 
+1

Esto debe marcarse como respuesta correcta porque respeta las inserciones que se establecieron antes de –

+0

Una combinación de esto y cambiar' tableView.estimatedRowHeight' a la altura de mi separador superior hizo el trabajo para yo. – Deco

+0

'tableView.layoutIfNeeded()' me ayudó después de 1-2 horas de lucha! – SoftDesigner

1

en Swift 3,1

DispatchQueue.main.async(execute: { 

     self.TableView.reloadData() 
     self.TableView.contentOffset = .zero 

    }) 
1

Esto es trabajo para mí.

tableView.scrollToRow(at: IndexPath.init(row: 0, section: 0), at: .top, animated: true) 
+0

La mejor manera si su número de artículos ha cambiado antes (con reloadData) – RPallas

Cuestiones relacionadas