36 Stimmen

Speichern der ausgewählten Zeile in UITableView nach ReloadData

Ich schreibe benutzerdefinierte Jabber-Client in iphone.

Yo uso xmppframework als Motor.

Und ich habe UITableViewController mit NSMutableArray für aktuelle Kontaktliste.

Wenn ich erhalten (oder jemand ändern es Inhalt) Dienstplan (aka Kontaktliste) ich möchte UITableView Elemente (hinzufügen/entfernen/ändern) ändern. Also, wenn Benutzer Arbeit mit listView zu Zeit, wenn Liste Updates von

[items addObject:newItem];
[self.tableView reloadData];

Benutzer hat aktuelles Auswahlelement verloren.

Also, meine Frage ist howto speichern (wenn möglich, ich meine, wenn gegebenes ausgewähltes Element nicht entfernt) aktuelle auswählen Element nach reloadData?

Vielen Dank.

69voto

Marco Punkte 845

Der einfache Weg ist etwa so:

NSIndexPath *ipath = [self.tableView indexPathForSelectedRow];
[self.tableView reloadData];
[self.tableView selectRowAtIndexPath:ipath animated:NO scrollPosition:UITableViewScrollPositionNone];

26voto

marmor Punkte 26315

Ich möchte die Antwort von Marco ein wenig ergänzen:

Erstens, wenn Sie Folgendes verwenden Mehrfachauswahl können Sie diese Methode zu Ihrer ViewController und rufen Sie es auf, wann immer Sie es brauchen [tableView reloadData] :

- (void)reloadTableView
{
    NSArray *indexPaths = [self.tableView indexPathsForSelectedRows];
    [self.tableView reloadData];
    for (NSIndexPath *path in indexPaths) {
        [self.tableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone];
    }
}

Zweitens, wenn Sie in einer UITableViewController und Sie die Auswahl nach dem Erscheinen von tableView beibehalten möchten, gibt es eine Funktion in UITableViewController: clearsSelectionOnViewWillAppear können Sie ein- oder ausschalten.

Siehe hier: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewController_Class/Reference/Reference.html

12voto

muhasturk Punkte 2274

Swift 4.2 Geprüft

Die richtige Weg, um ausgewählte Zeilen nach dem Neuladen der Tabellenansicht zu aktualisieren ist:

let selectedRows = tableView.indexPathsForSelectedRows

tableView.reloadData()

DispatchQueue.main.async {
    selectedRows?.forEach { selectedRow in
        tableView.selectRow(at: selectedRow, animated: false, scrollPosition: .none)
    }
}

5voto

Greg Punkte 71

Die Umgehung ist die Verwendung von reloadSections: anstelle von reloadData. Aus irgendeinem Grund entfernt reloadData die aktuelle Auswahl.

4voto

antonjn Punkte 139

Das Hinzufügen einer Verzögerung hat bei mir nicht funktioniert (getestet unter iOS 8.4 und iOS 9). Was funktionierte, war das Hinzufügen eines Aufrufs an -layoutIfNeeded auf die ausgewählte Zelle, nachdem Sie -selectRowAtIndexPath:animated:scrollPosition: .

NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
[self.tableView reloadData];
[self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
[[self.tableView cellForRowAtIndexPath:selectedIndexPath] layoutIfNeeded];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X