Sou um desenvolvedor iniciante em Swift e estou criando um aplicativo básico que inclui um UITableView. Quero atualizar uma determinada linha da tabela usando:
self.tableView.reloadRowsAtIndexPaths(paths, withRowAnimation: UITableViewRowAnimation.none)
e eu quero que a linha que será atualizada seja de um Int chamado rowNumber
O problema é que não sei como fazer isso e todos os tópicos que pesquisei são para Obj-C
Alguma ideia?
ios
uitableview
swift
nsindexpath
SentientBacon
fonte
fonte
Respostas:
Você pode criar um
NSIndexPath
usando o número da linha e da seção e recarregá-lo assim:let indexPath = NSIndexPath(forRow: rowNumber, inSection: 0) tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)
Neste exemplo, presumi que sua tabela tem apenas uma seção (ou seja, 0), mas você pode alterar esse valor de acordo.
Atualização para Swift 3.0:
let indexPath = IndexPath(item: rowNumber, section: 0) tableView.reloadRows(at: [indexPath], with: .top)
fonte
Para uma solução de animação de impacto suave:
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)
Esta é outra maneira de proteger o aplicativo contra falhas:
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) } }
fonte
Em 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, se você tem apenas uma seção em TableView, então você pode colocar o valor de seção 0.
fonte
Swift 4
let indexPathRow:Int = 0 let indexPosition = IndexPath(row: indexPathRow, section: 0) tableView.reloadRows(at: [indexPosition], with: .none)
fonte
let indexPathRow:Int = 0 let indexPosition = IndexPath(row: indexPathRow, section: 0) tableView.reloadRows(at: [indexPosition], with: .none)
fonte
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) }
fonte
Além disso, se você tiver seções para tableview, você não deve tentar encontrar todas as linhas que deseja atualizar, você deve usar reload seções. É um processo fácil e mais equilibrado:
yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)
fonte
E se:
self.tableView.reloadRowsAtIndexPaths([NSIndexPath(rowNumber)], withRowAnimation: UITableViewRowAnimation.Top)
fonte
Swift 4.1
use-o ao deletar linha usando selectedTag de linha
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)
fonte
Sei que esta pergunta é para Swift, mas aqui está o código equivalente Xamarin da resposta aceita se alguém estiver interessado.
var indexPath = NSIndexPath.FromRowSection(rowIndex, 0); tableView.ReloadRows(new NSIndexPath[] { indexPath }, UITableViewRowAnimation.Top);
fonte
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()
fonte