2009-05-22 21 views
45

nel mio UITableView a volte le celle rimangono selezionate dopo essere state toccate. Perché succede solo occasionalmente, non sono in grado di riprodurre il problema .iPhone Le celle UITableView rimangono selezionate

Eventuali suggerimenti? Forse ha qualcosa a che fare con il rilascio improprio di tableView?

- (void)tableView:(UITableView *)tableView 
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    NSUInteger row = [indexPath row]; 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

switch (row) { 
    case 0: 
     FruitViewController *fruitController = [FruitViewController alloc]; 
     [fruitController retain]; 
     [fruitController initWithNibName:@"FruitView" bundle:[NSBundle mainBundle]]; 
     [self.navigationController pushViewController:fruitController animated:YES]; 
     [fruitController release]; 
     break; 
    case 1: 
     CerealsViewController *cerealsController = [CerealsViewController alloc]; 
     [cerealsController retain]; 
     [cerealsController initWithNibName:@"CerealsView" bundle:[NSBundle mainBundle]]; 
     [self.navigationController pushViewController:cerealsController animated:YES]; 
     [cerealsController release]; 
     break; 
    default: 
     break; 
} 
    } 
+3

Forse si ignora viewWillAppear: animato senza chiamare [super viewWillAppear: animazione]? – Tieme

risposta

98

Non posso dire perché si sta vedendo il problema, ma qui ci sono alcuni suggerimenti per il fissaggio:

Secondo l'Apple HIG, la selezione non dovrebbe scomparire fino a quando il ritorno dal punto di vista controller appena spinto in pila. Se il tuo controller è solo un UITableViewController, dovrebbe deselezionare automaticamente al ritorno alla vista. In caso contrario, aggiungi

- (void) viewWillAppear:(BOOL)animated { 
    [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:animated]; 
    [super viewWillAppear:animated]; 
} 

da qualche parte nel controller di visualizzazione.

Se ci sono righe che, se cliccato, non andare a un'altra visualizzazione, e non in realtà fare nulla quando selezionato, non dovrebbero essere selezionabili, in modo da poter ignorare che nel

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 

e restituire nil nei casi in cui la riga non deve essere selezionata.

11

Solo per espandere la risposta di "Ed Marty", ho scelto di aggiungere la deselezione nel metodo "viewWillDisappear" perché pensavo che fosse più bello.

Oltre a questo, stavo usando UITableView con un normale UIViewController (piuttosto che un UITableViewController), quindi la variabile tableView non era disponibile per me. Per ovviare a questo ho aggiunto una proprietà tableView a mio avviso controllori file di intestazione (e nel mio file XIB ho collegato la vista reale tabella per la proprietà) ...

@property (nonatomic,retain) IBOutlet UITableView *tableView 

... e nella vista controllori implementazione cablata la proprietà ed eseguito il deselect come segue ..

@synthesize tableView 

- (void) viewWillDisappear:(BOOL)animated { 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:animated]; 
    [super viewWillDisappear:animated]; 
} 
+0

Grazie, le informazioni di IBOutlet mi hanno aiutato. –

+0

Questa soluzione è la migliore in quanto la risposta selezionata non funziona nel controller di navigazione – codingrhythm

21

una possibile causa è prevalente -viewWillAppear:animated: senza chiamare [super viewWillAppear] in un controller che si estende UITableViewController. L'aggiunta di [super viewWillAppear:animated] all'inizio del tuo metodo -viewWillAppear potrebbe risolvere il problema.

+0

Questo è stato per me, grazie! –

+0

Doh! Lo sapevo, ma grazie per il promemoria. –

8

Se si utilizza un UITableViewController è possibile utilizzare:

self.clearsSelectionOnViewWillAppear = YES; 
+0

Dove posso inserire questo? –

+0

provalo sul tuo viewDidLoad o ViewWillAppear @GajendraKChauhan – Pach

+0

non funziona quando passi da un'applicazione all'altra. –

4

Nel mio caso, ho deselezionare la cella a destra alla fine del didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    // Do smth here. segue ..etc 

    [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO]; 
} 
0

Utilizzare questo metodo nella classe UITableViewCell

(void)setSelected:(BOOL)selected animated:(BOOL)animated { 

// Just comment This line of code 

// [super setSelected:selected animated:animated]; 

} 

oppure si può provare questo codice in didSelectRowAtIndexPath metho d

- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath {

// fare alcune cose quando viene selezionata la riga

[tableView deselectRowAtIndexPath:indexPath animated:YES]; 

}

0

La soluzione di questo richiede circa due secondi dopo aver appreso come vengono gestite le tabelle.

Non appena le celle vengono spostate fuori dallo schermo, perdono la loro formattazione. La tabella riduce l'utilizzo della memoria ignorando le altre celle e ricreandole se/quando l'utente torna indietro.

Anche cose come il ricaricamento dei dati della tabella, che in realtà si applica solo alle celle sullo schermo in quel momento. Essendo il punto, cellForRowAtIndexPath potrebbe creare la stessa cella cinque volte senza che l'utente abbia mai premuto un pulsante o lasciato il controller della vista! Quindi configuralo per ricaricare qualsiasi formattazione. Aggiungere qualcosa di simile per cellForRowAtIndexPath:

if arrayOf_SelectedCells.contains(indexPath) { 
     setup_Selected(cell) 
     //Where setup_Selected is a custom function to apply formatt 
    } else { 
     setup_Unselected(cell) 
    } 
Problemi correlati