Adalah mungkin untuk me-refresh tunggal UITableViewCell di UITableView?

Saya punya kebiasaan UITableView menggunakan UITableViewCell ini. Masing-masingUITableViewCellmemiliki 2 tombol. Mengklik tombol ini akan mengubah gambar dalamUIImageView` dalam sel.

Adalah mungkin untuk me-refresh setiap sel terpisah untuk menampilkan gambar baru? Setiap bantuan sangat dihargai.

Larutan

Setelah anda memiliki indexPath ponsel anda, anda dapat melakukan sesuatu seperti:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

Dalam Xcode 4.6 dan lebih tinggi:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

Anda dapat mengatur apa pun yang anda suka sebagai efek animasi, tentu saja.

Komentar (12)

Saya mencoba menelepon -[UITableView cellForRowAtIndexPath:], tapi itu tidak't bekerja. Tapi, berikut ini bekerja untuk saya misalnya. Aku alokasi dan rilis the NSArray ketat untuk manajemen memori.

- (void)reloadRow0Section0 {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
    [indexPaths release];
}
Komentar (2)

Swift:

func updateCell(path:Int){
    let indexPath = NSIndexPath(forRow: path, inSection: 1)

    tableView.beginUpdates()
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
    tableView.endUpdates()
}
Komentar (1)

reloadRowsAtIndexPaths: baik-baik saja, tapi masih akan memaksa UITableViewDelegate metode untuk api.

Pendekatan paling sederhana yang bisa saya bayangkan adalah:

UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
[self configureCell:cell forIndexPath:indexPath];

It's penting untuk memanggil anda configureCell: implementasi di thread utama, seperti ini tidak akan bekerja pada non-UI benang (cerita yang sama dengan reloadData/reloadRowsAtIndexPaths:). Kadang-kadang ini mungkin bisa membantu untuk menambahkan:

dispatch_async(dispatch_get_main_queue(), ^
{
    [self configureCell:cell forIndexPath:indexPath];
});

It's juga layak untuk menghindari pekerjaan yang akan dilakukan di luar saat ini terlihat tampilan:

BOOL cellIsVisible = [[self.tableView indexPathsForVisibleRows] indexOfObject:indexPath] != NSNotFound;
if (cellIsVisible)
{
    ....
}
Komentar (3)

Jika anda menggunakan custom TableViewCells, generik

[self.tableView reloadData];    

tidak efektif menjawab pertanyaan ini kecuali anda meninggalkan tampilan saat ini dan datang kembali. Begitu juga dengan jawaban pertama.

Untuk berhasil reload tabel pertama melihat sel tanpa beralih views, gunakan kode berikut:

//For iOS 5 and later
- (void)reloadTopCell {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}

Masukkan kode berikut refresh metode yang panggilan untuk metode di atas agar anda dapat kustom reload hanya sel bagian atas (atau seluruh meja jika anda inginkan):

- (void)refresh:(UIRefreshControl *)refreshControl {
    //call to the method which will perform the function
    [self reloadTopCell];

    //finish refreshing 
    [refreshControl endRefreshing];
}

Sekarang bahwa anda memiliki yang diurutkan, dalam viewDidLoad tambahkan berikut:

//refresh table view
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];

[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];

[self.tableView addSubview:refreshControl];

Anda sekarang memiliki custom refresh tabel fitur yang akan reload atas sel. Untuk reload seluruh tabel, tambahkan

[mandiri.tableView reloadData]; anda baru refresh metode.

Jika anda ingin memuat ulang data setiap kali anda beralih pandangan, menerapkan metode:

//ensure that it reloads the table view data when switching to this view
- (void) viewWillAppear:(BOOL)animated {
    [self.tableView reloadData];
}
Komentar (0)

Swift 3 :

tableView.beginUpdates()
tableView.reloadRows(at: [indexPath], with: .automatic)
tableView.endUpdates()
Komentar (0)

Hanya untuk update ini jawaban sedikit dengan yang baru literal sintaks di iOS 6-anda dapat menggunakan Jalur = @[indexPath] untuk satu objek, atau Path = @[indexPath1, indexPath2,...] untuk beberapa objek.

Secara pribadi, saya've ditemukan literal sintaks untuk array dan kamus untuk menjadi sangat berguna dan besar penabung waktu. It's hanya lebih mudah untuk membaca, untuk satu hal. Dan hal ini menghilangkan kebutuhan untuk sebuah nihil pada akhir setiap multi-daftar objek, yang selalu menjadi pribadi bugaboo. Kita semua memiliki kincir angin untuk memiringkan dengan, ya? ;-)

Hanya pikir saya'd melempar ini ke dalam campuran. Semoga membantu.

Komentar (1)

Saya perlu meng-upgrade ponsel tetapi saya ingin menutup keyboard. Jika saya menggunakan

let indexPath = NSIndexPath(forRow: path, inSection: 1)
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
tableView.endUpdates()

keyboard hilang

Komentar (0)

Berikut ini adalah UITableView dengan ekstensi Swift 5:

import UIKit

extension UITableView
{    
    func updateRow(row: Int, section: Int = 0)
    {
        let indexPath = IndexPath(row: row, section: section)

        self.beginUpdates()
        self.reloadRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic)
        self.endUpdates()
    }

}

Panggilan dengan

self.tableView.updateRow(row: 1)
Komentar (0)