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.

0voto

Yaroslav Dukal Punkte 3788

SWIFT 3 :

self.collectionView.reloadData()
self.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: [])

0voto

tapizquent Punkte 532

Ich habe es besser gelöst, indem ich ein Array deklariert habe, um, sagen wir, die ID oder den String-Text der ausgewählten Zelle zu speichern, und es der didSelectItemAtIndexPath-Funktion hinzugefügt habe. Auf diese Weise bleiben die ausgewählten Zeilen erhalten, auch wenn sich die Anzahl der Zeilen ändert. Zum Beispiel:

var selectedItems: [String] = [] // This array type really depends on your preference and what property you're using to store
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    guard let cell = collectionView.cellForItem(at: indexPath) else { return }
    selectedItems.append(cell.textField.text)
}

Und auf Ihrer ersten cellForItemAtIndexPath

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionCell", for: indexPath)
    if let text = cell.textField.text {
        if selectedItems.contains(text) {
            collectionView.selectItem(at: indexPath, animated: true, scrollPosition: [])
        }
    }
    return cell
}

0voto

ingconti Punkte 9854

Meine zwei Cents für UICollectionView : (Abspann an Basil..)

Ich laufe im Hauptthread, da ich aus einer Hintergrundaufgabe neu lade:

final override func safeReloadData(){

            DispatchQueue.main.async { [weak self] in

                guard let self = self else {
                    return
                }

                let indexPaths = self.collectionView.indexPathsForSelectedItems
                self.collectionView.reloadData()
                for path in indexPaths ?? [] {
                    self.collectionView.selectItem(at: path, animated: false, scrollPosition: [])
                }
            }
    }

-5voto

Mobs Punkte 1574

Es hört sich so an, als ob Sie kein "Modell" für die Daten verwenden, sondern einfach die "Ansicht" (Benutzeroberfläche) aktualisieren, und das ist wahrscheinlich ein schlechtes Design.

reloadData sollte dazu führen, dass die Ansicht mit Daten aus dem Modell aktualisiert wird, die die aktuellsten anzuzeigenden Daten enthalten sollten.

Suche nach Ressourcen zum Thema "Model-View-Controller-Muster".

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