Segarkan baris UITableView tertentu berdasarkan Int di Swift

90

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?

SentientBacon
sumber
Apakah hanya ada satu bagian?
Lyndsey Scott

Jawaban:

198

Anda dapat membuat NSIndexPathmenggunakan 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)
Lyndsey Scott
sumber
jika untuk bagian tertentu jumlah baris akan diubah lalu? @ Lynsey Scott
turun pada
@ Lyndsey: Sebenarnya pada awalnya katakanlah saya memiliki 2 sel di bagian itu yang akan saya muat ulang, setelah memuat ulang katakanlah saya akan memiliki jumlah (x) sel di bagian tertentu itu, jadi pertanyaan saya adalah itu sejalan perhitungan jalur indeks, saya yakin tentang bagian itu tetapi saya bingung pada jumlah baris, karena itu mogok pada perubahan jumlah baris var indexPath = NSIndexPath (forRow: rowNumber, inSection: 0)
turun
@dip Anda perlu melihat tableView: numberOfRowsInSection: algoritma metode untuk mendapatkan info itu ... Saya akan merekomendasikan untuk memposting pertanyaan Anda di forum karena kedengarannya seperti masalah khusus yang Anda alami dengan kode Anda ...
Lyndsey Scott
Dimana memanggil metode ini?
Master AgentX
22

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)
   }
}
Alessandro Ornano
sumber
3

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.

jaiswal Rajan
sumber
3

Cepat 4

let indexPathRow:Int = 0    
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)
Neha
sumber
Mengapa Anda menyalin dan menempel jawaban saya?
Hardik Thakkar
2
let indexPathRow:Int = 0
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)
Sachin Rasane
sumber
1
Hai, Selamat datang di Stack Overflow dan terima kasih atas jawaban pertama Anda. Untuk membuat jawaban lebih berguna bagi orang lain, praktik terbaiknya adalah memberi anotasi pada jawaban Anda dengan teks yang menjelaskan mengapa menjawab pertanyaan awal OP.
Spangen
2

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)
    }
Legenda_ 33
sumber
1

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)
Burcu Kutluay
sumber
0

Bagaimana tentang:

self.tableView.reloadRowsAtIndexPaths([NSIndexPath(rowNumber)], withRowAnimation: UITableViewRowAnimation.Top)
skyline75489
sumber
0

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)
Rana Ali Waseem
sumber
0

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);
wildbagel
sumber
0
    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()
irwin B
sumber
Saya menemukan diri saya dalam situasi tertentu. Tujuan utama saya adalah mencapainya saat pengguna berada di dalam sel. Dan saya telah membuat beberapa modifikasi. Anda hanya dapat memperbarui sel yang ada di dalamnya, tanpa memuat seluruh tabel dan membingungkan pengguna. Karena alasan ini, fungsi ini memanfaatkan properti tableView, menambahkan ReloadDataCell kustom. Dan menambahkan tableview.reloadDataSavingSelecctions (). Di mana, Anda melakukan beberapa tindakan. Dan begitu saya melakukannya, saya ingin berbagi solusi itu dengan Anda.
irwin B
Tambahkan semua klarifikasi pada jawaban Anda dengan mengeditnya
Nico Haase