Saya bisa merancang UITableViewCells kustom dan memuatnya dengan baik menggunakan teknik yang dijelaskan dalam utas yang ditemukan di http://forums.macrumors.com/showthread.php?t=545061 . Namun, menggunakan metode itu tidak lagi memungkinkan Anda untuk menginisialisasi sel dengan reuseIdentifier yang berarti Anda harus membuat instance baru dari setiap sel di setiap panggilan. Adakah yang menemukan cara yang baik untuk tetap menyimpan jenis sel tertentu untuk digunakan kembali, tetapi masih dapat mendesainnya di Interface Builder?
ios
iphone
uitableview
cocoa-touch
interface-builder
Greg Martin
sumber
sumber
return NSStringFromClass([self class]);
Sebenarnya, karena Anda sedang membangun sel di Interface Builder, cukup setel pengenal penggunaan kembali di sana:
Atau jika Anda menjalankan Xcode 4, periksa tab Attributes inspector:
(Sunting: Setelah XIB Anda dibuat oleh XCode, itu berisi UIView kosong, tapi kami membutuhkan UITableViewCell; jadi Anda harus menghapus UIView secara manual dan memasukkan Tabel Tampilan Sel. Tentu saja, IB tidak akan menampilkan parameter UITableViewCell apa pun untuk UIView.)
sumber
Sekarang, di iOS 5 ada metode UITableView yang sesuai untuk itu:
- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier
sumber
Saya tidak ingat di mana awalnya saya menemukan kode ini, tetapi sejauh ini berhasil dengan baik untuk saya.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"CustomTableCell"; static NSString *CellNib = @"CustomTableCellView"; UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil]; cell = (UITableViewCell *)[nib objectAtIndex:0]; } // perform additional custom work... return cell; }
Contoh penyiapan Pembuat Antarmuka ...
sumber
Lihatlah jawaban yang saya berikan untuk pertanyaan ini:
Apakah mungkin untuk mendesain subclass NSCell di Interface Builder?
Tidak hanya mungkin mendesain UITableViewCell dalam IB, tetapi juga diinginkan karena jika tidak, semua kabel manual dan penempatan beberapa elemen sangat membosankan. Performaance baik-baik saja selama Anda berhati-hati untuk membuat semua elemen menjadi buram jika memungkinkan. ReuseID disetel di IB untuk properti UITableViewCell, lalu Anda menggunakan ID reuse yang cocok dalam kode saat mencoba melakukan dequeue.
Saya juga mendengar dari beberapa presenter di WWDC tahun lalu bahwa Anda tidak boleh membuat sel tampilan tabel di IB, tetapi ini adalah beban omong kosong.
sumber
Mulai iOS sekitar 4.0, ada instruksi khusus di dokumen iOS yang membuat ini bekerja sangat cepat:
http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7
Gulir ke bawah untuk membahas subclass UITableViewCell.
sumber
Ini opsi lain:
NSString * cellId = @"reuseCell"; //... NSArray * nibObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableCell" owner:nil options:nil]; for (id obj in nibObjects) { if ([obj isKindOfClass:[CustomTableCell class]]) { cell = obj; [cell setValue:cellId forKey:@"reuseIdentifier"]; break; } }
sumber
UITableViewCell
untuk menetapkan nilai unik untukreuseIdentifer
. Saya pikir inilah yang sebenarnya dicari oleh op asli.Saya membuat sel tampilan kustom saya dengan cara yang sama - kecuali saya menghubungkan sel melalui IBOutlet.
The
[nib objectAt...]
pendekatan adalah rentan terhadap perubahan posisi dari item dalam array.The
UIViewController
pendekatan baik - hanya mencoba, dan bekerja cukup baik.TAPI...
Dalam semua kasus,
initWithStyle
konstruktor TIDAK dipanggil, jadi tidak ada inisialisasi default yang dilakukan.Saya telah membaca berbagai tempat tentang penggunaan
initWithCoder
atauawakeFromNib
, tetapi tidak ada bukti konklusif bahwa salah satu dari ini adalah cara yang benar.Selain secara eksplisit memanggil beberapa metode inisialisasi dalam
cellForRowAtIndexPath
metode ini, saya belum menemukan jawaban untuk ini.sumber
Beberapa waktu yang lalu saya menemukan posting blog yang bagus tentang topik ini di blog.atebits.com , dan sejak itu mulai menggunakan kelas Loren Brichter ABTableViewCell untuk melakukan semua UITableViewCells saya.
Anda berakhir dengan UIView wadah sederhana untuk meletakkan semua widget Anda, dan pengguliran secepat kilat.
Semoga bermanfaat.
sumber
Teknik ini juga berfungsi dan tidak memerlukan ivar yang funky di pengontrol tampilan Anda untuk manajemen memori. Di sini, sel tampilan tabel kustom berada dalam xib bernama "CustomCell.xib".
static NSData *sLoadedCustomCell = nil; cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"]; if (cell == nil) { if (sLoadedCustomCell == nil) { // Load the custom table cell xib // and extract a reference to the cell object returned // and cache it in a static to avoid reloading the nib again. for (id loadedObject in [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:nil options:nil]) { if ([loadedObject isKindOfClass:[UITableViewCell class]]) { sLoadedCustomCell = [[NSKeyedArchiver archivedDataWithRootObject: loadedObject] retain]; break; } } cell = (UITableViewCell *)[NSKeyedUnarchiver unarchiveObjectWithData: sLoadedCustomCell]; }
sumber
Metode Louis berhasil untuk saya. Ini adalah kode yang saya gunakan untuk membuat UITableViewCell dari ujung pena:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellId"]; if (cell == nil) { UIViewController *c = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil]; cell = (PostCell *)c.view; [c release]; } return cell; }
sumber
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *simpleTableIdentifier = @"CustomCell"; CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; cell = [nib objectAtIndex:0]; [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; } return cell; }
sumber
Solusi gustavogb tidak berhasil untuk saya, yang saya coba adalah:
ChainesController *c = [[ChainesController alloc] initWithNibName:@"ChainesController" bundle:nil]; [[NSBundle mainBundle] loadNibNamed:@"ChaineArticleCell" owner:c options:nil]; cell = [c.blogTableViewCell retain]; [c release];
Sepertinya berhasil. BlogTableViewCell adalah IBOutlet untuk sel dan ChainesController adalah pemilik file.
sumber
Dari dokumen UITableView tentang
dequeueWithReuseIdentifier
: "Sebuah string yang mengidentifikasi objek sel untuk digunakan kembali. Secara default, pengidentifikasi sel yang dapat digunakan kembali adalah nama kelasnya, tetapi Anda dapat mengubahnya menjadi nilai arbitrer."Overriding -reuseIdentifer sendiri berisiko. Apa yang terjadi jika Anda memiliki dua subclass dari subclass sel Anda, dan menggunakan keduanya dalam satu tampilan tabel? Jika mereka mengirim panggilan pengenal reuse ke super, Anda akan membatalkan antrean sel dengan jenis yang salah ............. Saya rasa Anda perlu mengganti metode reuseIdentifier, tetapi mengembalikan pengenal yang diganti tali. Atau, jika salah satu belum ditentukan, kembalikan kelas sebagai string.
sumber
Untuk apa nilainya, saya bertanya kepada insinyur iPhone tentang ini di salah satu Pembicaraan Teknologi iPhone. Jawabannya adalah, "Ya, IB dapat digunakan untuk membuat sel. Tapi jangan. Tolong, jangan."
sumber
Saya mengikuti instruksi Apple yang ditautkan oleh Ben Mosher (terima kasih!) Tetapi menemukan bahwa Apple menghilangkan poin penting. Objek yang mereka desain di IB hanyalah UITableViewCell, seperti variabel yang mereka muat darinya. Tetapi jika Anda benar-benar menyiapkannya sebagai subkelas khusus dari UITableViewCell, dan menulis file kode untuk subkelas tersebut, Anda dapat menulis deklarasi IBOutlet dan metode IBAction dalam kode dan menyambungkannya ke elemen khusus Anda di IB. Maka tidak perlu menggunakan tag tampilan untuk mengakses elemen ini dan Anda dapat membuat sel gila apa pun yang Anda inginkan. Ini surga Cocoa Touch.
sumber