Seperti yang saya pahami, Anda ingin:
- Desain sel dalam IB yang dapat digunakan dalam beberapa adegan storyboard.
- Konfigurasikan segmen storyboard unik dari sel itu, tergantung pada adegan tempat sel itu berada.
Sayangnya, saat ini tidak ada cara untuk melakukan ini. Untuk memahami mengapa upaya Anda sebelumnya tidak berhasil, Anda perlu memahami lebih lanjut tentang cara storyboard dan sel tampilan tabel prototipe bekerja. (Jika Anda tidak peduli mengapa upaya lain ini tidak berhasil, jangan ragu untuk pergi sekarang. Saya tidak punya solusi ajaib untuk Anda, selain menyarankan agar Anda mengajukan bug.)
Papan cerita, pada dasarnya, tidak lebih dari sekumpulan file .xib. Saat Anda memuat pengontrol tampilan tabel yang memiliki beberapa sel prototipe dari storyboard, inilah yang terjadi:
- Setiap sel prototipe sebenarnya tertanam mini-nib. Jadi ketika pengontrol tampilan tabel memuat, itu berjalan melalui masing-masing nibs dan panggilan sel prototipe
-[UITableView registerNib:forCellReuseIdentifier:]
.
- Tampilan tabel meminta controller untuk sel.
- Anda mungkin menelepon
-[UITableView dequeueReusableCellWithIdentifier:]
Saat Anda meminta sel dengan pengenal penggunaan kembali yang diberikan, ia memeriksa apakah nibnya telah terdaftar. Jika ya, ia membuat instance sel itu. Ini terdiri dari langkah-langkah berikut:
- Lihatlah kelas sel, sebagaimana didefinisikan dalam ujung sel. Panggil
[[CellClass alloc] initWithCoder:]
.
- The
-initWithCoder:
Metode melewati dan menambahkan subviews dan set properti yang didefinisikan dalam pena. ( IBOutlet
Mungkin juga terhubung di sini, meskipun saya belum mengujinya; itu mungkin terjadi di -awakeFromNib
)
Anda mengkonfigurasi sel Anda seperti yang Anda inginkan.
Hal penting yang perlu diperhatikan di sini adalah ada perbedaan antara kelas sel dan tampilan visual sel. Anda bisa membuat dua sel prototipe terpisah dari kelas yang sama, tetapi dengan subview mereka yang ditata dengan sangat berbeda. Bahkan, jika Anda menggunakan UITableViewCell
gaya default , inilah yang sebenarnya terjadi. Gaya "Default" dan gaya "Subtitle", misalnya, keduanya diwakili oleh UITableViewCell
kelas yang sama .
Ini penting : Kelas sel tidak memiliki korelasi satu-ke-satu dengan hierarki tampilan tertentu . Hirarki tampilan sepenuhnya ditentukan oleh apa yang ada di sel prototipe yang didaftarkan dengan pengontrol khusus ini.
Perhatikan, juga, bahwa pengidentifikasi ulang sel tidak terdaftar di beberapa apotik sel global. Pengidentifikasi ulang menggunakan hanya digunakan dalam konteks satu UITableView
contoh.
Dengan informasi ini, mari kita lihat apa yang terjadi dalam upaya Anda di atas.
Di Controller # 1, menambahkan sel prototipe, mengatur kelas ke subkelas UITableViewCell saya, mengatur id reuse, menambahkan label dan kabel mereka ke outlet kelas. Di Controller # 2, tambahkan sel prototipe kosong, atur ke kelas yang sama dan gunakan kembali id seperti sebelumnya. Saat dijalankan, label tidak pernah muncul ketika sel ditampilkan di Kontroler # 2. Bekerja dengan baik di Kontroler # 1.
Ini diharapkan. Sementara kedua sel memiliki kelas yang sama, hierarki tampilan yang diteruskan ke sel di Controller # 2 sepenuhnya tanpa subview. Jadi Anda mendapatkan sel kosong, yang persis seperti yang Anda masukkan ke dalam prototipe.
Didesain setiap jenis sel dalam NIB yang berbeda dan terhubung ke kelas sel yang sesuai. Di storyboard, tambahkan sel prototipe kosong dan atur kelasnya dan gunakan kembali id untuk merujuk ke kelas sel saya. Dalam metode viewDidLoad dari pengontrol, mendaftarkan file NIB tersebut untuk id penggunaan kembali. Ketika ditampilkan, sel-sel di kedua kontroler kosong seperti prototipe.
Sekali lagi, ini diharapkan. Pengidentifikasi kembali menggunakan tidak dibagikan antara adegan storyboard atau biji, sehingga fakta bahwa semua sel yang berbeda memiliki pengidentifikasi menggunakan kembali yang sama tidak ada artinya. Sel yang Anda dapatkan kembali dari tampilan tabel akan memiliki tampilan yang cocok dengan sel prototipe di adegan storyboard itu.
Namun solusi ini sudah dekat. Seperti yang Anda catat, Anda bisa secara terprogram memanggil -[UITableView registerNib:forCellReuseIdentifier:]
, melewati UINib
sel yang mengandung, dan Anda akan mendapatkan kembali sel yang sama. (Ini bukan karena prototipe itu "mengungguli" ujung pena; Anda hanya belum mendaftarkan ujung biji ke tampilan meja, jadi masih melihat ujung pena yang tertanam di storyboard.) Sayangnya, ada kelemahan dengan pendekatan ini - tidak ada cara untuk menyambungkan storyboard segues ke sel di nib mandiri.
Terus prototipe di kedua kontroler kosong dan mengatur kelas dan menggunakan kembali id ke kelas sel saya. Membuat UI sel sepenuhnya dalam kode. Sel bekerja dengan baik di semua pengontrol.
Tentu saja. Semoga ini tidak mengejutkan.
Jadi, itu sebabnya itu tidak berhasil. Anda dapat mendesain sel-sel Anda di nibs mandiri dan menggunakannya dalam beberapa adegan storyboard; Anda saat ini tidak bisa menghubungkan segues storyboard ke sel-sel itu. Semoga, bagaimanapun, Anda telah belajar sesuatu dalam proses membaca ini.
Terlepas dari jawaban hebat dari BJ Homer, saya merasa saya punya solusi. Sejauh pengujian saya berjalan, itu berfungsi.
Konsep: Buat kelas khusus untuk sel xib. Di sana Anda dapat menunggu acara sentuh dan melakukan segue secara terprogram. Sekarang yang kita butuhkan hanyalah referensi ke controller yang melakukan Segue. Solusi saya adalah mengaturnya
tableView:cellForRowAtIndexPath:
.Contoh
Saya memiliki
DetailedTaskCell.xib
sel tabel yang ingin saya gunakan dalam beberapa tampilan tabel:Ada kelas khusus
TaskGuessTableCell
untuk sel itu:Ini adalah dimana keajaiban terjadi.
Saya memiliki beberapa segues tetapi mereka semua memiliki nama yang sama:
"FinishedTask"
. Jika Anda perlu fleksibel di sini, saya sarankan untuk menambahkan properti lain.ViewController terlihat seperti ini:
Mungkin ada cara yang lebih elegan untuk mencapai hal yang sama tetapi - itu berhasil! :)
sumber
-setSelected:
mengganti di sel, dan memicu segue hanya saat beralih dariNO
keYES
.setSelected:
, BJ. Terima kasih. Memang, ini adalah solusi yang salah ( rasanya salah), tetapi pada saat yang sama, itu berfungsi, jadi saya menggunakannya sampai ini diperbaiki (atau sesuatu berubah di pengadilan Apple).Saya mencari ini dan saya menemukan jawaban ini oleh Richard Venable. Ini bekerja untuk saya.
sumber
BJ Homer telah memberikan penjelasan yang bagus tentang apa yang sedang terjadi.
Dari sudut pandang praktis saya akan menambahkan bahwa, mengingat Anda tidak dapat memiliki sel sebagai xibs DAN menghubungkan segues, yang terbaik untuk memilih adalah memiliki sel sebagai xib - transisi jauh lebih mudah untuk dipertahankan daripada tata letak sel dan properti di beberapa tempat. , dan segue Anda kemungkinan akan berbeda dari pengontrol yang berbeda pula. Anda dapat mendefinisikan segue langsung dari pengontrol tampilan tabel ke pengontrol berikutnya, dan melakukannya dalam kode. .
Catatan selanjutnya adalah bahwa memiliki sel Anda sebagai file xib yang terpisah mencegah Anda dapat menghubungkan tindakan apa pun dll langsung ke pengontrol tampilan tabel (toh, saya belum menyelesaikan ini - Anda tidak dapat mendefinisikan pemilik file sebagai sesuatu yang bermakna ). Saya mengatasi ini dengan mendefinisikan sebuah protokol yang pengontrol tampilan tabel sel diharapkan sesuai dengan dan menambahkan controller sebagai properti lemah, mirip dengan delegasi, di cellForRowAtIndexPath.
sumber
Cepat 3
BJ Homer memberikan penjelasan yang bagus, Ini membantu saya memahami konsepnya. Untuk
make a custom cell reusable in storyboard
, yang dapat digunakan dalam TableViewController apa pun yang harus kitamix the Storyboard and xib
dekati. Misalkan kita memiliki sel bernamaCustomCell
yang akan digunakan dalamTableViewControllerOne
danTableViewControllerTwo
. Saya membuatnya dalam beberapa langkah.1. File> Baru> Klik File> Pilih Cocoa Touch Class> klik Next> Beri Nama kelas Anda (misalnya
CustomCell
)> pilih Subkelas sebagai UITableVieCell> Centang kotak juga buat file XIB dan tekan Berikutnya.2. Kustomisasi sel seperti yang Anda inginkan dan atur pengenal di atribut inspector untuk sel, di sini kita akan menetapkan sebagai
CellIdentifier
. Pengidentifikasi ini akan digunakan di ViewController Anda untuk mengidentifikasi dan menggunakan kembali Cell.3. Sekarang kita harus
register this cell
di ViewController kamiviewDidLoad
. Tidak perlu metode inisialisasi.4. Sekarang kita bisa menggunakan sel khusus ini di tableView apa pun.
Di TableViewControllerOne
sumber
Saya menemukan cara untuk memuat sel untuk VC yang sama, tidak diuji untuk segues. Ini bisa menjadi solusi untuk membuat sel dalam nib yang terpisah
Katakanlah Anda memiliki satu VC dan 2 tabel dan Anda ingin mendesain sel di storyboard dan menggunakannya di kedua tabel.
(mis: tabel dan bidang pencarian dengan UISearchController dengan tabel untuk hasil dan Anda ingin menggunakan Cell yang sama di keduanya)
Ketika controller meminta sel lakukan ini:
Dan di sini Anda memiliki sel Anda dari storyboard
sumber
tableView:cellForRowAtIndexPath:
).