Odśwież określony wiersz UITableView na podstawie Int w Swift


89

Jestem początkującym programistą w Swift i tworzę podstawową aplikację, która zawiera UITableView. Chcę odświeżyć określony wiersz tabeli za pomocą:

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

i chcę, aby wiersz, który zostanie odświeżony, pochodził z Int o nazwie rowNumber

Problem w tym, że nie wiem, jak to zrobić, a wszystkie wątki, które szukałem, dotyczą Obj-C

Jakieś pomysły?


Czy jest tylko jedna sekcja?
Lyndsey Scott

Odpowiedzi:


196

Możesz utworzyć, NSIndexPathużywając numeru wiersza i sekcji, a następnie załadować go ponownie w następujący sposób:

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

W tym przykładzie założyłem, że twoja tabela ma tylko jedną sekcję (tj. 0), ale możesz odpowiednio zmienić tę wartość.

Aktualizacja dla Swift 3.0:

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

czy dla danego odcinka zmieni się liczba wierszy? @Lyndsey Scott
zanurz

@Lyndsey: Właściwie na początku powiedzmy, że mam 2 komórki w tej sekcji, którą zamierzam przeładować, po ponownym załadowaniu powiedzmy, że będę miał dowolną (x) liczbę komórek w tej konkretnej sekcji, więc moje pytanie brzmi: obliczanie ścieżki indeksu, jestem pewien co do sekcji, ale jestem zdezorientowany co do liczby wierszy, ponieważ powoduje awarię
dip

@dip musisz spojrzeć na swoją tabelęView: numberOfRowsInSection: metoda algorytm, aby uzyskać te informacje ... Polecam opublikowanie pytania na forum, ponieważ wygląda na to, że masz konkretny problem z kodem ...
Lyndsey Scott

Gdzie nazwać tę metodę?
Master AgentX

22

Aby uzyskać animację o miękkim uderzeniu:

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)

Oto kolejny sposób ochrony aplikacji przed awarią:

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

Szybki 4

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

2

W 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, jeśli masz tylko jedną sekcję w TableView, możesz umieścić wartość sekcji 0.


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

1
Cześć, Witamy w Stack Overflow i dziękuję za pierwszą odpowiedź. Aby odpowiedź była bardziej użyteczna dla innych osób, najlepiej jest opatrzyć ją adnotacją tekstem wyjaśniającym, dlaczego odnosi się do pierwotnego pytania PO.
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)
    }

1

Ponadto, jeśli masz sekcje dla widoku tabeli, nie powinieneś próbować znaleźć wszystkich wierszy, które chcesz odświeżyć, powinieneś użyć przeładowania sekcji. To łatwy i bardziej zrównoważony proces:

yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)

0

Co powiesz na:

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

0

Swift 4.1

użyj go, gdy usuwasz wiersz za pomocą selectedTag of row.

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

Zdaję sobie sprawę, że to pytanie dotyczy języka Swift, ale tutaj jest odpowiednik kodu Xamarin zaakceptowanej odpowiedzi, jeśli ktoś jest zainteresowany.

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()

Znalazłem się w szczególnej sytuacji. Moim głównym celem było osiągnięcie tego, gdy użytkownik jest w celi. I dokonałem pewnych modyfikacji. Możesz zaktualizować tylko komórkę, w której się znajduje, bez ładowania całej tabeli i dezorientowania użytkownika. Z tego powodu ta funkcja korzysta z właściwości tableView, dodając niestandardowy ReloadDataCell. I dodanie tableview.reloadDataSavingSelecctions (). Gdzie wykonujesz jakąś akcję. A kiedy już to zrobiłem, chciałem się z tobą podzielić tym rozwiązaniem.
irwin B

Dodaj wszelkie wyjaśnienia do swojej odpowiedzi, edytując ją
Nico Haase
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.