Aktualisieren Sie eine bestimmte Zeile von UITableView basierend auf Int in Swift


87

Ich bin ein Anfänger in Swift und erstelle eine Basis-App, die eine UITableView enthält. Ich möchte eine bestimmte Zeile der Tabelle aktualisieren mit:

self.tableView.reloadRowsAtIndexPaths(paths, withRowAnimation: UITableViewRowAnimation.none)

und ich möchte, dass die Zeile, die aktualisiert wird, aus einem Int mit dem Namen rowNumber stammt

Das Problem ist, ich weiß nicht, wie ich das machen soll und alle Threads, die ich gesucht habe, sind für Obj-C

Irgendwelche Ideen?


Gibt es nur einen Abschnitt?
Lyndsey Scott

Antworten:


194

Sie können eine NSIndexPathmit der Zeilen- und Abschnittsnummer erstellen und dann wie folgt neu laden:

let indexPath = NSIndexPath(forRow: rowNumber, inSection: 0)
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)

In diesem Beispiel habe ich angenommen, dass Ihre Tabelle nur einen Abschnitt enthält (dh 0), aber Sie können diesen Wert entsprechend ändern.

Update für Swift 3.0:

let indexPath = IndexPath(item: rowNumber, section: 0)
tableView.reloadRows(at: [indexPath], with: .top)

Wenn für einen bestimmten Abschnitt die Anzahl der Zeilen geändert werden soll? @ Lyndsey Scott
Dip

@Lyndsey: Eigentlich sagen wir zuerst, ich habe 2 Zellen in dem Abschnitt, von dem ich neu laden werde, nach dem Neuladen sagen wir, ich werde eine (x) Anzahl von Zellen in diesem bestimmten Abschnitt haben, also ist meine Frage die in der Zeile von Indexpfadberechnung, ich bin sicher über den Abschnitt, aber ich bin verwirrt über die Anzahl der Zeilen, weil es bei Änderung der Anzahl der Zeilen abstürzt var indexPath = NSIndexPath (forRow: rowNumber, inSection: 0)
Dip

@dip Sie müssen sich Ihren tableView: numberOfRowsInSection: -Methodenalgorithmus ansehen, um diese Informationen zu erhalten ... Ich würde empfehlen, Ihre Frage im Forum zu veröffentlichen, da dies nach einem bestimmten Problem mit Ihrem Code klingt ...
Lyndsey Scott

Wo soll man diese Methode aufrufen?
Master AgentX

22

Für eine Soft Impact-Animationslösung:

Swift 3:

let indexPath = IndexPath(item: row, section: 0)
tableView.reloadRows(at: [indexPath], with: .fade)

Swift 2.x:

let indexPath = NSIndexPath(forRow: row, inSection: 0)
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

Dies ist eine weitere Möglichkeit, die App vor Abstürzen zu schützen:

Swift 3:

let indexPath = IndexPath(item: row, section: 0)
if let visibleIndexPaths = tableView.indexPathsForVisibleRows?.index(of: indexPath as IndexPath) {
    if visibleIndexPaths != NSNotFound {
        tableView.reloadRows(at: [indexPath], with: .fade)
    }
}

Swift 2.x:

let indexPath = NSIndexPath(forRow: row, inSection: 0)
if let visibleIndexPaths = tableView.indexPathsForVisibleRows?.indexOf(indexPath) {
   if visibleIndexPaths != NSNotFound {
      tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
   }
}

4

Swift 4

let indexPathRow:Int = 0    
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)

2

In Swift 3.0

let rowNumber: Int = 2
let sectionNumber: Int = 0

let indexPath = IndexPath(item: rowNumber, section: sectionNumber)

self.tableView.reloadRows(at: [indexPath], with: .automatic)

byDefault, wenn Sie nur einen Abschnitt in TableView haben, können Sie den Abschnittswert 0 setzen.


2
let indexPathRow:Int = 0
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)

1
Hallo, Willkommen bei Stack Overflow und vielen Dank für Ihre erste Antwort. Um die Antwort für andere Personen nützlicher zu machen, sollten Sie Ihre Antwort mit einem Text versehen, der erklärt, warum die ursprüngliche Frage des OP behandelt wird.
Spangen

2

SWIFT 4.2

    func reloadYourRows(name: <anyname>) {
    let row = <your array name>.index(of: <name passing in>)
    let reloadPath = IndexPath(row: row!, section: 0)
    tableView.reloadRows(at: [reloadPath], with: .middle)
    }

0

Wie wäre es mit:

self.tableView.reloadRowsAtIndexPaths([NSIndexPath(rowNumber)], withRowAnimation: UITableViewRowAnimation.Top)

0

Wenn Sie Abschnitte für die Tabellenansicht haben, sollten Sie nicht versuchen, alle Zeilen zu finden, die Sie aktualisieren möchten. Sie sollten außerdem Abschnitte zum erneuten Laden verwenden. Es ist ein einfacher und ausgewogenerer Prozess:

yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)

0

Swift 4.1

Verwenden Sie diese Option, wenn Sie eine Zeile mit dem ausgewählten Tag der Zeile löschen.

self.tableView.beginUpdates()

        self.yourArray.remove(at:  self.selectedTag)
        print(self.allGroups)

        let indexPath = NSIndexPath.init(row:  self.selectedTag, section: 0)

        self.tableView.deleteRows(at: [indexPath as IndexPath], with: .automatic)

        self.tableView.endUpdates()

        self.tableView.reloadRows(at: self.tableView.indexPathsForVisibleRows!, with: .automatic)

0

Mir ist klar, dass diese Frage für Swift ist, aber hier ist der Xamarin-äquivalente Code der akzeptierten Antwort, wenn jemand interessiert ist.

var indexPath = NSIndexPath.FromRowSection(rowIndex, 0);
tableView.ReloadRows(new NSIndexPath[] { indexPath }, UITableViewRowAnimation.Top);

0
    extension UITableView {
        /// Reloads a table view without losing track of what was selected.
        func reloadDataSavingSelections() {
            let selectedRows = indexPathsForSelectedRows

            reloadData()

            if let selectedRow = selectedRows {
                for indexPath in selectedRow {
                    selectRow(at: indexPath, animated: false, scrollPosition: .none)
                }
            }
        }
    }

tableView.reloadDataSavingSelections()

Ich befand mich in einer bestimmten Situation. Mein Hauptziel war es, dies zu erreichen, wenn sich der Benutzer in einer Zelle befindet. Und ich habe einige Änderungen vorgenommen. Sie können nur die Zelle aktualisieren, in der sie sich befindet, ohne die gesamte Tabelle zu laden und den Benutzer zu verwirren. Aus diesem Grund nutzt diese Funktion die tableView-Eigenschaften und fügt eine benutzerdefinierte ReloadDataCell hinzu. Und Hinzufügen von tableview.reloadDataSavingSelecctions (). Wo machst du etwas? Und als ich das tat, wollte ich diese Lösung mit Ihnen teilen.
Irwin B

Bitte fügen Sie Ihrer Antwort alle Klarstellungen hinzu, indem Sie sie bearbeiten
Nico Haase
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.