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