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?

SentientBacon
quelle
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)
Lyndsey Scott
quelle
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)
   }
}
Alessandro Ornano
quelle
4

Swift 4

let indexPathRow:Int = 0    
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)
Neha
quelle
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.

Jaiswal Rajan
quelle
2
let indexPathRow:Int = 0
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)
Sachin Rasane
quelle
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)
    }
Legende_ 33
quelle
0

Wie wäre es mit:

self.tableView.reloadRowsAtIndexPaths([NSIndexPath(rowNumber)], withRowAnimation: UITableViewRowAnimation.Top)
skyline75489
quelle
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)
Burcu Kutluay
quelle
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)
Rana Ali Waseem
quelle
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);
Wildbagel
quelle
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()
irwin B.
quelle
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