2010-10-20 11 views
32

Ho seguito il suggerimento di Luca Redpath qui - Selected UItableViewCell staying blue when selected - per deselezionare la riga quando si torna alla visualizzazione tabella originale, ma non riesco a farlo funzionare. In realtà il metodo non viene attivato.Deselezionando la riga di visualizzazione tabella quando si restituisce

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
} 

ho il sospetto che questo è perché la classe non è un UITableViewController, ma un UIViewController con la tableView come una proprietà collegata fino al pennino.

Come si ottiene lo stesso comportamento, ovvero deselezionando al momento della restituzione?

+0

Non dovrebbe essere importante finché il TableView è collegato correttamente. Dovresti essere in grado di metterlo in "didSelectRowAtIndexPath:" e farlo funzionare. Si potrebbe anche voler fare un rapido controllo di NSLog su cosa '[self.tableView indexPathForSelectedRow]' ritorna dal momento che potrebbe effettivamente ritornare nil. – iwasrobbed

+0

L'ho usato ma ho riscontrato un problema in cui la modifica di elementi nella cella (sfondo, ecc.) Non si rifletteva immediatamente. Aggiunta di reloadRowsAtIndexPaths: in didDeselectRowAtIndexPath: ha fatto il trucco – nh32rg

risposta

15

Se si utilizza un navigationController, lo si può fare con il suo delegato:

- (void)navigationController: (UINavigationController *)navigationController 
     didShowViewController: (UIViewController *)viewController 
        animated: (BOOL)animated 
{ 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
} 

Ma bisogna verificare se il controller spettacolo è che si desidera =/

[EDIT] Crea la presa e collegarla in IB a NavigationController

@interface MyInt <UINavigationControllerDelegate> 
{ 
    IBOutlet UINavigationController *navigation; 
    ... 
} 
@property (nonatomic, retain) UINavigationController *navigation; 
... 
@end 

@implementation MyInt 
@syntesize navigation; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.navigation setDelegate: self]; 
} 
... 

@end 
+0

Il mio controller nav è stato creato nel mio pennino, quindi non ha una classe corrispondente.C'è un modo per aggirare questo? – cannyboy

+0

Puoi mapparlo a un ivar IBOutlet. –

+0

La mia configurazione è che ho una classe MainViewController con un NIB corrispondente. Quel pennino ha UITabBarController (anche una proprietà di IBOutlet 'tabBarController' in MainViewController). All'interno di questa barra delle schede ci sono diversi controller UINavigation. Questi non sono referenziati nel codice. Quindi non sono sicuro di come accedere a uno di questi controller nav – cannyboy

8

Si sta selezionando la riga a livello di programmazione? Se è così, ho avuto lo stesso problema quando ho selezionato una riga usando [cellToBeSelected setSelected:YES];.

Utilizzando il metodo selectRowAtIndexPath:animated:scrollPosition:UITableViewController ha tenuto traccia del indexPath corrente selezionato.

Infatti, se clearsSelectionOnViewWillAppear è impostato su true, non è possibile deselezionare manualmente le righe.

21

perché basta non deselezionate nel metodo delegato

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

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 

} 
+2

Non devi fare '[self.tableView indexPathForSelectedRow]', indexPath è già un parametro, e puoi semplicemente inserirlo lì. –

+0

Inoltre, se stai utilizzando il metodo delegate, dovresti utilizzare il parametro 'tableView' invece di' self.tableView', perché potrebbero essere potenzialmente diversi se hai più visualizzazioni tabella. –

8

ho hade lo stesso problema, ma dopo il debug ho scoperto il conteggio indexPathForSelectedRow era 0 così ho ricontrollato il mio codice e ho notato che ero chiamando

Dopo aver eliminato questa riga, ha funzionato come previsto.

+0

Questo è stato un errore completamente ovvio che mi ha catturato. Penso che molte persone, incluso me stesso, abbiano disattivato la deselezione del delegato. – micnguyen

4

Molto semplice: Prova questa riga.

Aggiungere deselectRowAtIndexPath nel didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

} 
0
-(BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return YES; 
} 

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:[UIColor grayColor]]; 
} 

-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:[UIColor clearColor]]; 
} 
+0

Si prega di descrivere perché questa è la soluzione. Qual è il cambiamento/trucco? –

1

Swift 3,0

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
      tableView.deselectRow(at: indexPath, animated: true) 
    //Write Your Other code Here. 
      } 

It Will deselezionare Row dopo aver fatto clic su It.

Problemi correlati