2013-02-19 12 views
29

Mam zaznaczoną komórkę, która jest widoczna, gdy użytkownik ją wybierze, a następnie zostanie przeniesiona do widoku szczegółowego. Chciałbym, aby komórka była nieoświetlona po powrocie do kontrolera widoku tabeli.Jak odznaczyć komórkę uitableview, gdy użytkownik wraca do kontrolera widoku?

Jak mógłbym osiągnąć ten cel?

Zgaduję [cell.textLabel setHighlighted:NO]; w viewWillAppear, ale komórka jest niezgłoszona, jeśli ją tam umieściłem.

dzięki za wszelką pomoc

+0

Jeśli używasz storyboardu, możesz po prostu sprawdzić atrybut zaznaczenia. –

+0

@AlexanderFNwłaściwość, że ta właściwość pojawia się tylko wtedy, gdy użyjesz UITableViewController – commando24

Odpowiedz

71

Jeśli używasz UITableViewController podklasę potem po prostu ustawić właściwość

self.clearsSelectionOnViewWillAppear = YES; 

innego na viewDidAppear zadzwoń

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

perfect! dzięki – hanumanDev

+4

Uwaga: 'clearsSelectionOnViewWillAppear' działa przez większość czasu. Nie zadziała, jeśli "przeciągniesz do tyłu" na iOS7 z powrotem do tableViewController. Druga metoda działa cały czas z dodaną ładną animacją. – Byte

+4

Myślę, że lepiej jest użyć viewWillAppear niż viewDidAppear - czas animacji wygląda bardziej spójnie z tym, co robi UITableViewController. – chrisbuchholz

4

spróbować

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

Lub jakiś nieelegancki sposób =)

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

Postanowiłem zrobić to odpowiedź zamiast komentarza.

Jeśli używasz storyboard: kliknięcie swojej UITableViewController -> Sprawdź "wybór: jasne, na wygląd" okno

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

(Prawdopodobnie możesz usunąć' self' przed każdym wywołaniem 'tableView', aby uzyskać bardziej przejrzysty i szybszy kod.) – royalmurder

+0

Na pewno . Po prostu lubię jasno określać zmienne, które należą do kontrolera, więc nie mylę ich ze zmiennymi lokalnymi. Tylko osobiste preferencje. –

+0

@royalmurder Zdecydowanie można go usunąć; to tylko kwestia stylu. Osobiście wolę używać siebie do rozróżniania właściwości klasy od ivars, jak wspomniał Dustin. Niezależnie od tego, użycie samego siebie nie ma wpływu na funkcjonalność. – vikzilla

2

Swift 3

func clearOnAppearance() { 
    for indexPath in tableView.indexPathsForSelectedRows ?? [] { 
     tableView.deselectRow(at: indexPath, animated: true) 
    } 
} 
Powiązane problemy