2012-01-18 25 views
11

Aparece un error al utilizar mi aplicación que usaba tableviews, el error es el siguiente.error con scrollToRowAtIndexPath

2012-01-19 10:19:51.442 bcode[1176:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]: row (3) beyond bounds (3) for section (0).' 
*** First throw call stack: 
(0x16c3052 0x1920d0a 0x166ba78 0x166b9e9 0x68a136 0x3bfdf 0x6c2fbf 0x6c32d4 0x6c35d7 0x6d2666 0x87890e 0x878c17 0x878c86 0x62c499 0x62c584 0x2718e00 0x13614f0 0x15fa833 0x15f9db4 0x15f9ccb 0x1d05879 0x1d0593e 0x5fba9b 0x2838 0x2795 0x1) 
terminate called throwing an exception(gdb) 

Lo que está sucediendo es que cuando el usuario profundiza mi vista de navegación que pueden seleccionar una celda de la tableview de cada vista, que más tarde será utilizado para construir una cadena de búsqueda.

Sin embargo, les permito retroceder y cambiar su selección si cometieron un error .. este error ocurre cuando el usuario cambia el valor de la vista principal y luego va a la subvista solo si la selección anterior estaba fuera del número de entradas en la tabla actual ...

normalmente esto no sería un gran problema, sin embargo, dentro de viewDidAppear estoy llamando a un método que se desplaza a la celda seleccionada previamente ... que obviamente es lo que está rompiendo la aplicación y dándome el error.

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    //Scroll to previously selected value 
    [self.tableView scrollToRowAtIndexPath:oldCheckedIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
} 

cómo puedo evitar que esto ejecución He tratado a unos 100 diferentes indexpaths si statments en la vista padre y la subvista agarrar la nueva indexpath y agains de cheques oldselected luego poner

oldCheckedIndexPath = nil; 

sin embargo de alguna manera siempre se las arregla para estropear de todos modos.

Respuesta

23

La forma más limpia, asumiendo self es la fuente de datos tableView:

Compruebe el número de secciones en el tableview:

if ([self numberOfSectionsInTableView:self.tableView] 
            > oldCheckedIndexPath.section 

y compruebe el número de filas en esa sección:

&& [self tableView:self.tableView numberOfRowsInSection: 
      oldCheckedIndexPath.section] > oldCheckedIndexPath.row) 
    { 
     [self.tableView scrollToRowAtIndexPath: // etc etc etc 

O, el hack rápido:

@try { 
    [self.tableView scrollToRowAtIndexPath: // etc etc etc 
} 
@catch (NSException *e) 
{ 
    NSLog(@"bummer: %@",e); 
} 
+0

oh sí !!! no puedo creer que no haya pensado en eso ... ¡¡¡whicked !! funcionó perfectamente! jajaja ¡Honestamente he estado atormentando mi cerebro durante las últimas 5 horas tratando de descifrar éste! ¡Perfecto! ¡muchas gracias! –

+3

+1 ¡Para el humorístico NSLog! BTW @ C.Johns no usa el método try ... catch - es una práctica increíblemente mala (al menos en C - Java es una cuestión totalmente diferente ...). – jrtc27

+0

jaja sí Me reí de eso ... @jrtc27, sí, fui con la declaración correctamente construida ... funcionó perfectamente. –

1

Lo resolví a través de otra opción antes de llamar a scrollToRowAtIndexPath: este método recarga su tabla como [yourtableviewobject reloadData]; y luego llamar NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([messages count] - 1) inSection:0]; [objTableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

1

inspirado en la respuesta aceptada:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
if ([self numberOfSectionsInTableView:self.tableView] > indexPath.section && [self tableView:self.tableView numberOfRowsInSection:indexPath.section] > indexPath.row) { 
    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} 
Cuestiones relacionadas