Saya seorang pengembang pemula di Swift, dan saya membuat aplikasi dasar yang menyertakan UITableView. Saya ingin menyegarkan baris tertentu dari tabel menggunakan:
self.tableView.reloadRowsAtIndexPaths(paths, withRowAnimation: UITableViewRowAnimation.none)
dan saya ingin baris yang akan di-refresh dari Int bernama rowNumber
Masalahnya adalah, saya tidak tahu bagaimana melakukan ini dan semua utas yang saya cari adalah untuk Obj-C
Ada ide?
ios
uitableview
swift
nsindexpath
SentientBacon
sumber
sumber
Jawaban:
Anda dapat membuat
NSIndexPath
menggunakan nomor baris dan bagian lalu memuatnya kembali seperti ini:let indexPath = NSIndexPath(forRow: rowNumber, inSection: 0) tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)
Dalam contoh ini, saya berasumsi bahwa tabel Anda hanya memiliki satu bagian (yaitu 0) tetapi Anda dapat mengubah nilainya.
Pembaruan untuk Swift 3.0:
let indexPath = IndexPath(item: rowNumber, section: 0) tableView.reloadRows(at: [indexPath], with: .top)
sumber
Untuk solusi animasi berdampak lembut:
Cepat 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)
Ini adalah cara lain untuk melindungi aplikasi agar tidak mogok:
Cepat 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) } }
sumber
Di 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, jika Anda hanya memiliki satu bagian di TableView, Anda dapat meletakkan nilai bagian 0.
sumber
Cepat 4
let indexPathRow:Int = 0 let indexPosition = IndexPath(row: indexPathRow, section: 0) tableView.reloadRows(at: [indexPosition], with: .none)
sumber
let indexPathRow:Int = 0 let indexPosition = IndexPath(row: indexPathRow, section: 0) tableView.reloadRows(at: [indexPosition], with: .none)
sumber
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) }
sumber
Selain itu, Jika Anda memiliki bagian untuk tampilan tabel, Anda tidak boleh mencoba menemukan setiap baris yang ingin Anda muat ulang, Anda harus menggunakan muat ulang bagian. Ini adalah proses yang mudah dan lebih seimbang:
yourTableView.reloadSections(IndexSet, with: UITableViewRowAnimation)
sumber
Bagaimana tentang:
self.tableView.reloadRowsAtIndexPaths([NSIndexPath(rowNumber)], withRowAnimation: UITableViewRowAnimation.Top)
sumber
Swift 4.1.0
gunakan saat Anda menghapus baris menggunakan 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)
sumber
Saya menyadari pertanyaan ini untuk Swift, tetapi ini adalah kode setara Xamarin dari jawaban yang diterima jika seseorang tertarik.
var indexPath = NSIndexPath.FromRowSection(rowIndex, 0); tableView.ReloadRows(new NSIndexPath[] { indexPath }, UITableViewRowAnimation.Top);
sumber
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()
sumber