2013-02-19 7 views
29

Ho una cella viewualizzata evidenziata quando un utente la seleziona e quindi viene spostata in una vista di dettaglio. Vorrei che la cella non fosse evidenziata quando tornano al controller di visualizzazione vista tabella.Come deselezionare una cella con vista Uitable quando l'utente ritorna al controller della vista

come farei per realizzare questo?

Sto supponendo [cell.textLabel setHighlighted:NO]; in viewWillAppear, ma la cella non è dichiarata se la metto lì.

Grazie per qualsiasi aiuto

+0

Se si utilizza lo storyboard, è sufficiente verificare l'attributo clear selection. –

+0

@AlexanderofNorway quella proprietà appare solo se usi UITableViewController – commando24

risposta

71

Se si utilizza UITableViewController sottoclasse poi basta impostare la proprietà

self.clearsSelectionOnViewWillAppear = YES; 

altro sul viewDidAppear basta chiamare

NSIndexPath *indexPath = self.tableView.indexPathForSelectedRow; 
if (indexPath) { 
    [self.tableView deselectRowAtIndexPath:indexPath animated:animated]; 
} 

// MARK: - Swift 3 
if let indexPath = tableView.indexPathForSelectedRow { 
    tableView.deselectRow(at: indexPath, animated: animated) 
} 
+0

perfetto! grazie – hanumanDev

+4

Nota: 'clearsSelectionOnViewWillAppear' funziona la maggior parte del tempo. Non funzionerà se si "scorre indietro" su iOS7 sul TableViewController. Il secondo metodo funziona sempre, con un'adeguata animazione. – Byte

+4

Penso che sia meglio usare viewWillAppear di viewDidAppear - l'animazione-timing sembra più coerente con ciò che fa UITableViewController. – chrisbuchholz

4

cercano

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Deselect the row which was tapped 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 
0

O qualche modo inelegante =)

NSArray *arrayWithPaths = [tableView indexPathsForVisibleRows]; 
for (NSIndexPath *path in arrayWithPaths) 
{ 
    [tableview deselectRowAtIndexPath:path animated:NO]; 
} 
6

Ho deciso di rendere questa una risposta invece di un commento.

Se si utilizza storyboard: Clicca sulla tua UITableViewController -> Selezionare la casella "Selezione: chiare su Appearance" scatola

11

Swift 3,0

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

    if let selectionIndexPath = self.tableView.indexPathForSelectedRow { 
     self.tableView.deselectRow(at: selectionIndexPath, animated: animated) 
    } 
} 
+0

(Potresti probabilmente rimuovere il' self' prima di ogni invocazione di 'tableView', per un codice più pulito e più snello.) – royalmurder

+0

. Mi piace solo essere esplicito sulle variabili che appartengono al controller in modo da non farle confondere con le variabili locali. Solo una preferenza personale. –

+0

@royalmurder Si può sicuramente rimuoverlo; è solo una questione di stile. Personalmente preferisco usare me stesso per differenziare le proprietà della classe dagli ivar, come ha detto Dustin. Indipendentemente da ciò, l'uso di sé qui non ha alcun impatto sulla funzionalità a portata di mano. – vikzilla

2

rapida 3

func clearOnAppearance() { 
    for indexPath in tableView.indexPathsForSelectedRows ?? [] { 
     tableView.deselectRow(at: indexPath, animated: true) 
    } 
} 
Problemi correlati