2012-01-18 9 views
11

Viene visualizzato un errore quando si utilizza la mia applicazione che utilizza tabelle viste, l'errore è simile a questo.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) 

Quello che sta accadendo è che quando le frese utente lungo la vista di navigazione si può selezionare una cella dal Tableview di ciascuna vista, che in seguito verrà utilizzato per costruire una stringa di ricerca.

Tuttavia, permetto loro di tornare indietro e modificare la loro selezione se hanno commesso un errore .. questo errore si verifica quando l'utente cambia il valore della vista genitore, quindi va nella sottoview solo se la selezione precedente era al di fuori del numero di voci nella tabella attuale ..

normalmente questo non sarebbe un grosso problema tuttavia, all'interno di viewDidAppear sto chiamando un metodo che scorre alla cella precedentemente selezionata ... che ovviamente è ciò che sta rompendo l'app e dandomi l'errore.

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

come posso fermare questo dall'esecuzione ho provato a circa 100 differenti indexpaths se statments nella vista padre e la visualizzazione secondaria di prendere il nuovo indexpath e agains controllo oldselected quindi impostando

oldCheckedIndexPath = nil; 

tuttavia in qualche modo riesce sempre a rovinare comunque.

risposta

23

Il modo pulito, assumendo self è l'origine dati tableView:

Controllare il numero di sezioni in tableView:

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

e controllare il numero di righe in quella sezione:

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

Oppure, il trucco rapido:

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

oh sì !!! non posso pensare che non .. maledetto !! ha funzionato perfettamente! lol Ho onestamente rovinato il mio cervello per le ultime 5 ore cercando di rompere questo! perfezionare! Grazie mille! –

+3

+1 per il divertente NSLog! BTW @ C.Johns non usa il metodo try ... catch - è una pratica incredibilmente cattiva (almeno in C - Java è una questione completamente diversa ...). – jrtc27

+0

haha ​​sì, ho riso a quello .. @ jrtc27, sì, sono andato con la dichiarazione correttamente costruita se ... ha funzionato perfettamente. –

1

L'ho risolto tramite un'altra opzione prima di chiamare scrollToRowAtIndexPath: questo metodo ricarica la vista tabella come [yourtableviewobject reloadData]; e quindi chiamare NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([messages count] - 1) inSection:0]; [objTableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

1

Ispirato dalla risposta accettata:

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]; 
} 
Problemi correlati