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?


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)

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)
   }
}

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.


3

Cepat 4

let indexPathRow:Int = 0    
let indexPosition = IndexPath(row: indexPathRow, section: 0)
tableView.reloadRows(at: [indexPosition], with: .none)

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)

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)
    }

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)

0

Bagaimana tentang:

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

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)

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);

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()

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.