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?
ios
uitableview
swift
nsindexpath
SentientBacon
źródło
źródło
Odpowiedzi:
Możesz utworzyć,
NSIndexPath
uż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)
źródło
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) } }
źródło
Szybki 4
let indexPathRow:Int = 0 let indexPosition = IndexPath(row: indexPathRow, section: 0) tableView.reloadRows(at: [indexPosition], with: .none)
źródło
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.
źródło
let indexPathRow:Int = 0 let indexPosition = IndexPath(row: indexPathRow, section: 0) tableView.reloadRows(at: [indexPosition], with: .none)
źródło
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) }
źródło
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)
źródło
Co powiesz na:
self.tableView.reloadRowsAtIndexPaths([NSIndexPath(rowNumber)], withRowAnimation: UITableViewRowAnimation.Top)
źródło
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)
źródło
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);
źródło
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()
źródło