2011-12-16 8 views
16

Ho un UITableView con celle in uno Storyboard e un seguito che collega le celle a un'altra vista.UITableViewCells non deseleziona quando si torna da un seguito

Quando si seleziona una cella, visualizza l'animazione di selezione cella (trasformando la cella in grigio, nel mio caso) e spinge l'altra vista sullo schermo. Ma quando si ritorna alla visualizzazione tabella, l'animazione di deselezione non viene visualizzata affatto (il contrario dell'animazione di selezione). Dal momento che sto usando solo un seguito, mi aspettavo che questo si occupasse di default.

C'è un modo per forzarlo a mostrare l'animazione di deselezione?

+0

trovato la soluzione qui: http://stackoverflow.com/domande/1840614/why-fa-UITableView-cell-rimanere-evidenziata. –

risposta

11

Non sono sicuro circa l'uso di segues ma spesso mi desidera aggiornare i dati quando viene visualizzato un controller della vista. Tuttavia, se ricarichi la tabella, cancelli la riga di selezione. Ecco un codice che uso per mantenere una riga selezionata e mostrare l'animazione deselezionata al ritorno. Potrebbe essere il caso che questo ti possa aiutare quindi lo posterò qui.

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    NSIndexPath *indexPath = [tableView indexPathForSelectedRow]; 
    [tableView reloadData]; 
    if(indexPath) { 
     [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
    } 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    NSIndexPath *indexPath = [tableView indexPathForSelectedRow]; 
    if(indexPath) { 
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    } 
} 
+0

Ricarica i dati della tabella, ma la soluzione non ha funzionato. (Avevo provato prima, ma per essere sicuro di aver provato di nuovo.) –

+0

Stai ricaricando il tavolo da qualche altra parte? Assicurarsi inoltre di non rimuovere la riga selezionata prima di chiamare viewWillAppear. A seconda di come cambiano i dati, la nuova selezione della stessa riga potrebbe non funzionare. – Chase

+0

L'ho accettato anche se non ho mai risolto questo problema. Suppongo di dover ricaricare da qualche parte. –

22

Questo sarebbe gestito automaticamente se il controller di visualizzazione era una sottoclasse di UITableViewController e clearsSelectedOnViewWillAppear è stato impostato su YES (che è il valore predefinito).

Nel tuo caso puoi farlo nello stesso modo in cui lo fa UITableViewController. Deseleziona la riga selezionata in -viewWillAppear:.

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; 
    [self.tableView deselectRowAtIndexPath:selectedIndexPath animated:YES]; 
} 
+0

Il mio controller di visualizzazione è una sottoclasse di UITableViewController. La cella viene deselezionata quando viene mostrata, ma semplicemente non mostra un'animazione: è deselezionata per iniziare. (Nel caso in cui, ho provato quello che hai suggerito e non ha funzionato.) –

+0

Ho appena creato un progetto di esempio con un 'UITableViewController' in un' UINavigationController' che spinge ad un altro controller di visualizzazione. Tutti impostati utilizzando uno storyboard con segues e spuntando il controller di visualizzazione visualizza l'animazione di deselezione. Forse la vista del controller di visualizzazione originale viene scaricata, quindi lo stato di selezione della tabella viene perso. Questo può accadere in situazioni di alta pressione della memoria. –

+0

La mia app è configurata come descritto (ma anche con schede) e utilizza i dati principali. La maggior parte delle richieste al momento sono solo due o tre record (per i test), quindi non penserei che sarebbe un drenaggio delle risorse di memoria. –

9

Assicurarsi che si sta chiamando i super implementazioni dei metodi viewWill... e viewDid...

+0

Lo sto facendo in tutti i metodi ereditati. –

+0

Come stai tornando al tuo UITableViewController? Stai usando il pulsante Indietro predefinito che viene liberato quando usi un passo 'push' nello storyboard? –

+0

Sono. Il mio UITableViewController si trova all'interno di un UINavigationController e torno alla vista tabella dalla vista di dettaglio con il pulsante Indietro che crea il controller di navigazione. (e il seguito è un tipo '' push'') –

1

Swift Aggiornamento: -

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(true) 
    if tableView.indexPathForSelectedRow != nil { 
     let indexPath: NSIndexPath = tableView.indexPathForSelectedRow! 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
    } 
} 
1

Meglio aggiornamento Swift:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    if let path = tableView.indexPathForSelectedRow { 

     tableView.deselectRowAtIndexPath(path, animated: true) 
    } 
} 
2

Per Swift 3

override func viewWillAppear(_ animated: Bool) { 

    super.viewWillAppear(animated) 
    if let path = tableView.indexPathForSelectedRow { 

     tableView.deselectRow(at: path, animated: true) 
    } 
} 
Problemi correlati