web-dev-qa-db-de.com

UITableView deaktiviert die ausgewählte Zeile nicht automatisch, wenn die Tabelle erneut angezeigt wird

Normalerweise wird eine ausgewählte Zeile in einer UITableView mit einer Animation abgewählt, wenn der Benutzer aus der Detailansicht zurückspringt. 

In meinem Fall jedoch, wenn ich eine UITableView in eine UIViewController eingebettet habe, muss ich dies manuell in viewWillAppear tun:

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    // For some reason the tableview does not do it automatically
    [self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow 
                                  animated:YES];  
}

Warum ist das so und wie wird es behoben?

41
Besi

Wenn der Haupt-ViewController vom Typ UITableViewController ist, hat er eine EigenschaftclearsSelectionOnViewWillAppear, die standardmäßig YES ist. Dadurch wird die Auswahl automatisch gelöscht. 

Diese Eigenschaft ist für eine UITableView nicht verfügbar. Dies liegt daran, dass sie auch keine ViewWillAppear-Methode hat. 

Ein UIViewController benötigt diese Eigenschaft nicht, da ursprünglich keine UITableView vorhanden ist.

fazit: Sie müssen es selbst implementieren, wenn Sie keine UITableViewController verwenden.

64
Herm

Machen Sie die Abwahl in didSelectRowAtIndexPath anstelle von viewWillAppear:

- (void)tableView:(UITableView *)tableView
                  didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
     //show the second view..
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
 }
31
janusfidel

In Swift können Sie folgende Zeilen in Ihre viewWillAppear einfügen:

if let row = tableView.indexPathForSelectedRow() {
    tableView.deselectRowAtIndexPath(row, animated: true)
}

In Swift 2 gibt es keine Klammern:

if let row = tableView.indexPathForSelectedRow {
    tableView.deselectRowAtIndexPath(row, animated: true)
}

In Swift 4 (und 3?) Wurde der Funktionsname aufgeräumt:

if let indexPath = tableView.indexPathForSelectedRow {
    tableView.deselectRow(at: indexPath, animated: true)
}
21
Kevin R

Ich glaube nicht, dass die Auswahl der ausgewählten Zeile automatisch ist

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

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    // to do other things
    [self.navigationController pushViewController:yourNextViewController animated:YES];
}
4
Neo

Nichts ist falsch - die Auswahl der hervorgehobenen Zeile ist immer "manuell". Wenn Sie sich den Beispielcode von Apple ansehen, sehen Sie dasselbe.

1
nielsbot

In Swift 3/4

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}
0
oscar castellon