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?
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.
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];
}
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)
}
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];
}
Nichts ist falsch - die Auswahl der hervorgehobenen Zeile ist immer "manuell". Wenn Sie sich den Beispielcode von Apple ansehen, sehen Sie dasselbe.
In Swift 3/4
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}