2010-04-21 18 views
7

Estoy usando iPhone SDK 3.1.3. Tengo un UITableViewController que obtiene datos de otro controlador. La vista de tabla se agrega como una subvista a la vista principal pero el marco está configurado para que no esté visible. El marco de la vista de tabla se actualiza y se hace deslizar sobre la vista principal tocando un botón.UITableView desplazarse a la posición específica

Aparece la vista de tabla y me desplazo a la última fila. Si selecciono la última fila, recargo la tabla con más datos. La tabla se actualiza con más datos. Todo funciona bien, excepto que la posición de desplazamiento siempre es la superior.

Necesito que la posición de desplazamiento sea la última fila en la que hice clic para cargar más datos. Guardo la posición de desplazamiento y llamo al siguiente código después de que carga más datos. Se ejecuta sin problemas, pero la posición de desplazamiento siempre es la parte superior.

[theTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:savedScrollPosition inSection:0] atScrollPosition:savedScrollPosition animated:NO]; 

Lo anterior no parece tener ningún efecto. ViewWillAppear:ViewDidAppear: no se dispara y me dicen que si el controlador de vista se crea una instancia en el código, que es el caso, estos no se disparan. Por favor, ayúdame a descubrir cómo y cuándo establecer la posición de desplazamiento después de que la tabla se recargue ([theTableView reloadData]) para que esté en la fila en la que hice clic.

Código para recargar vista de tabla de desplazamiento &

////performAction will notify the tableviewcontroller which will result in didPerformAction being called 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == lastRow) 
    { 
     savedScrollPosition = lastRow; 
     //perform the action 
     [controller performAction]; 
    } 
} 

- (void) didPerformAction:(NSNotification *)obj 
{ 
    [theTableView reloadData]; 
    [theTableView 
    scrollToRowAtIndexPath: [NSIndexPath indexPathForRow:savedScrollPosition inSection:0] 
    atScrollPosition:UITableViewScrollPositionBottom 
    animated:NO]; 
} 

Respuesta

28

Esto parecía hacer el truco.

[theTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:savedScrollPosition inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
CGPoint point = theTableView.contentOffset; 
point .y -= theTableView.rowHeight; 
theTableView.contentOffset = point; 
+2

qué es savedScrollPosition en esta declaración –

0

Si ese es el código real y asumiendo theTableView no es nula allí, que debería estar recibiendo una advertencia diciendo "puede no responder a ...", porque es scrollToRowAtIndexPath deletreado mal

En segundo lugar, el parámetro atScrollPosition espera un valor de enum UITableViewScrollPosition que indica en qué parte de la pantalla desea colocar la fila de destino.

Prueba esto:

[theTableView scrollToRowAtIndexPath: 
       [NSIndexPath indexPathForRow:savedScrollPosition inSection:0] 
       atScrollPosition:UITableViewScrollPositionBottom 
       animated:NO]; 
+0

disculpa que fue un error tipográfico. Lo he editado. Bueno, no quiero desplazarme hacia la parte inferior. Necesito desplazarme a la fila en la que hice clic, que es una especie de medio, pero no del medio, cada vez. Sin embargo, probé esto y extrañamente, todavía se mantiene en la cima. – Dave

+0

Muestra el método al que se llama. Ponga NSLogs antes de la llamada mostrando el valor de savedScrollPosition. atScrollPosition no se refiere al número de fila sino a su posición relativa actual en la pantalla. – DyingCactus

+0

oh ya veo. Actualicé el código. – Dave

10

Se verá mejor y la posición de desplazamiento permanecerá fijo si se puede insertar las filas en lugar de llamar reloadData.

[theTableView beginUpdates]; 
[theTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
// make sure the dataSource will return new rows before calling endUpdates 
[theTableView endUpdates]; 

En lugar de utilizar UITableView desplazamiento puede utilizar UIScrollView desplazamiento:

savedOffset = [theTableView contentOffset]; 

continuación, restaurar:

[theTableView setContentOffset:savedOffset]; 
+0

oh gracias, acabo de publicar la respuesta que es en su mayoría la misma que la tuya, configurando contentOffset. Gracias por la sugerencia de fila de inserción. – Dave

Cuestiones relacionadas