Saya punya kebiasaan UITableView
menggunakan UITableViewCell ini. Masing-masing
UITableViewCellmemiliki 2 tombol. Mengklik tombol ini akan mengubah gambar dalam
UIImageView` dalam sel.
Adalah mungkin untuk me-refresh setiap sel terpisah untuk menampilkan gambar baru? Setiap bantuan sangat dihargai.
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.
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];
}
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()
}
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)
{
....
}
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];
}
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.
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
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)