Я начинающий разработчик Swift и создаю базовое приложение, которое включает UITableView. Я хочу обновить определенную строку таблицы, используя:
self.tableView.reloadRowsAtIndexPaths(paths, withRowAnimation: UITableViewRowAnimation.none)
и я хочу, чтобы строка, которая будет обновлена, будет из Int с именем rowNumber
Проблема в том, что я не знаю, как это сделать, и все потоки, которые я искал, относятся к Obj-C.
Любые идеи?
ios
uitableview
swift
nsindexpath
SentientBacon
источник
источник
Ответы:
Вы можете создать,
NSIndexPath
используя номер строки и раздела, а затем перезагрузить его следующим образом:let indexPath = NSIndexPath(forRow: rowNumber, inSection: 0) tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)
В этом примере я предположил, что ваша таблица имеет только один раздел (т.е. 0), но вы можете изменить это значение соответствующим образом.
Обновление для Swift 3.0:
let indexPath = IndexPath(item: rowNumber, section: 0) tableView.reloadRows(at: [indexPath], with: .top)
источник
Для решения с мягким воздействием анимации:
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)
Это еще один способ защитить приложение от сбоев:
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) } }
источник
Swift 4
let indexPathRow:Int = 0 let indexPosition = IndexPath(row: indexPathRow, section: 0) tableView.reloadRows(at: [indexPosition], with: .none)
источник
В 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)
По умолчанию, если у вас есть только один раздел в TableView, вы можете поставить значение раздела 0.
источник
let indexPathRow:Int = 0 let indexPosition = IndexPath(row: indexPathRow, section: 0) tableView.reloadRows(at: [indexPosition], with: .none)
источник
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) }
источник
Кроме того, если у вас есть разделы для tableview, вы не должны пытаться найти все строки, которые хотите обновить, вы должны использовать разделы перезагрузки. Это простой и более сбалансированный процесс:
yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)
источник
Как насчет:
self.tableView.reloadRowsAtIndexPaths([NSIndexPath(rowNumber)], withRowAnimation: UITableViewRowAnimation.Top)
источник
Swift 4.1
используйте его при удалении строки с помощью selectedTag строки.
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)
источник
Я понимаю, что это вопрос для Swift, но вот эквивалентный код Xamarin принятого ответа, если кому-то интересно.
var indexPath = NSIndexPath.FromRowSection(rowIndex, 0); tableView.ReloadRows(new NSIndexPath[] { indexPath }, UITableViewRowAnimation.Top);
источник
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()
источник