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.