Pembaruan 1/12/2016 : Ini tahun 2016 dan saya masih lebih suka menata kode UI saya dan bukan di Storyboards. Yang sedang berkata, Storyboards telah datang jauh. Saya telah menghapus semua poin dari posting ini yang tidak berlaku lagi pada tahun 2016.
Pembaruan 4/24/2015 : Yang menarik Apple bahkan tidak menggunakan Storyboard di ResearchKit mereka yang baru-baru ini bersumber terbuka seperti yang diperhatikan Peter Steinberger (di bawah judul "Interface Builder").
Pembaruan 6/10/2014 : Seperti yang diharapkan, Apple terus meningkatkan Storyboards dan Xcode. Beberapa poin yang berlaku untuk iOS 7 dan di bawah tidak berlaku untuk iOS 8 lagi (dan sekarang ditandai seperti itu). Jadi, sementara Storyboard secara inheren masih memiliki kekurangan, saya merevisi saran saya dari tidak digunakan secara selektif untuk menggunakannya .
Bahkan sekarang iOS 9 sudah keluar, saya akan menyarankan melawanuntuk menggunakan hati-hati saat memutuskan apakah akan menggunakan Storyboard. Inilah alasan saya:
Storyboard gagal saat runtime, bukan pada waktu kompilasi : Anda memiliki kesalahan ketik dalam nama segue atau menghubungkannya dengan salah di storyboard Anda? Ini akan meledak saat runtime. Anda menggunakan subkelas UIViewController khusus yang tidak ada lagi di storyboard Anda? Ini akan meledak saat runtime. Jika Anda melakukan hal-hal tersebut dalam kode, Anda akan menangkapnya sejak dini, selama waktu kompilasi. Memperbarui : Alat baru saya StoryboardLint sebagian besar memecahkan masalah ini.
Storyboard menjadi membingungkan dengan cepat : Seiring proyek Anda tumbuh, storyboard Anda semakin sulit dinavigasi. Juga, jika beberapa pengontrol tampilan memiliki beberapa segmen ke beberapa pengontrol tampilan lainnya, storyboard Anda dengan cepat mulai terlihat seperti semangkuk spageti dan Anda akan menemukan diri Anda memperbesar dan memperkecil dan menggulir ke semua tempat untuk menemukan pengontrol tampilan yang Anda cari untuk dan untuk mengetahui poin segue mana. Pembaruan : Masalah ini sebagian besar dapat diselesaikan dengan membagi Storyboard Anda menjadi beberapa Storyboards, seperti yang dijelaskan dalam artikel ini oleh Pilky dan artikel ini oleh Robert Brown .
Storyboard membuat bekerja dalam tim lebih sulit : Karena Anda biasanya hanya memiliki satu file storyboard besar untuk proyek Anda, membuat banyak pengembang secara teratur membuat perubahan pada satu file itu bisa menjadi sakit kepala: Perubahan perlu digabung dan konflik diselesaikan. Ketika konflik terjadi, sulit untuk mengatakan bagaimana mengatasinya: Xcode menghasilkan file XML storyboard dan itu tidak benar-benar dirancang dengan tujuan bahwa manusia harus membaca, apalagi mengeditnya.
Storyboard membuat ulasan kode sulit atau hampir tidak mungkin : Ulasan kode rekan adalah hal yang hebat untuk dilakukan di tim Anda. Namun, ketika Anda membuat perubahan pada storyboard, hampir tidak mungkin untuk meninjau perubahan ini dengan pengembang yang berbeda. Yang dapat Anda tarik hanyalah sebuah file XML yang sangat besar. Menguraikan apa yang benar-benar berubah dan apakah perubahan itu benar atau jika mereka merusak sesuatu sangat sulit.
Storyboards menghambat penggunaan kembali kode : Dalam proyek iOS saya, saya biasanya membuat kelas yang berisi semua warna dan font serta margin dan inset yang saya gunakan di seluruh aplikasi untuk memberikan tampilan dan rasa yang konsisten: Ini adalah perubahan satu baris jika saya harus sesuaikan salah satu dari nilai-nilai itu untuk seluruh aplikasi. Jika Anda menetapkan nilai-nilai tersebut di storyboard, Anda menduplikasinya dan perlu menemukan setiap kejadian ketika Anda ingin mengubahnya. Kemungkinan besar Anda melewatkannya, karena tidak ada pencarian dan ganti di storyboard.
Storyboard membutuhkan saklar konteks konstan : Saya menemukan diri saya bekerja dan menavigasi lebih cepat dalam kode daripada di storyboard. Saat aplikasi Anda menggunakan storyboard, Anda terus-menerus mengubah konteks: "Oh, saya ingin mengetuk sel tampilan tabel ini untuk memuat pengontrol tampilan yang berbeda. Sekarang saya harus membuka storyboard, menemukan pengontrol tampilan yang benar, membuat segue baru ke view controller lain (yang juga harus saya temukan), berikan nama segue, ingat nama itu (saya tidak bisa menggunakan konstanta atau variabel di storyboard), kembali ke kode dan berharap saya tidak salah ketik nama segue untuk metode prepForSegue saya. Betapa saya berharap saya bisa mengetikkan 3 baris kode di sini di mana saya berada! " Tidak, itu tidak menyenangkan. Beralih antara kode dan storyboard (dan antara keyboard dan mouse) menjadi cepat dan memperlambat Anda.
Storyboard sulit untuk di-refactor : Ketika Anda melakukan refactor pada kode Anda, Anda harus memastikan itu masih cocok dengan yang diharapkan storyboard Anda. Ketika Anda memindahkan barang-barang di storyboard Anda, Anda hanya akan mengetahui saat runtime jika masih bekerja dengan kode Anda. Rasanya bagi saya seolah-olah saya harus menyinkronkan dua dunia. Rasanya rapuh dan membuat perubahan dalam pendapat saya yang sederhana.
Storyboard kurang fleksibel : Dalam kode, Anda pada dasarnya dapat melakukan apa pun yang Anda inginkan! Dengan storyboard, Anda terbatas pada subset dari apa yang dapat Anda lakukan dalam kode. Terutama ketika Anda ingin melakukan beberapa hal maju dengan animasi dan transisi, Anda akan menemukan diri Anda "melawan papan cerita" untuk membuatnya bekerja.
Storyboard tidak memungkinkan Anda mengubah jenis pengontrol tampilan khusus : Anda ingin mengubah UITableViewController
a UICollectionViewController
? Atau ke dataran UIViewController
? Tidak mungkin di Storyboard. Anda harus menghapus pengontrol tampilan lama dan membuat yang baru dan menghubungkan kembali semua segmen. Jauh lebih mudah untuk melakukan perubahan kode.
Storyboard menambahkan dua kewajiban tambahan untuk proyek Anda : (1) Alat Editor Storyboard yang menghasilkan XML storyboard dan (2) komponen runtime yang mem-parsing XML dan membuat UI dan objek pengontrol darinya. Kedua bagian dapat memiliki bug yang tidak dapat Anda perbaiki.
Storyboard tidak memungkinkan Anda untuk menambahkan subview keUIImageView
: Siapa yang tahu mengapa.
Storyboard tidak memungkinkan Anda untuk mengaktifkan Tata Letak Otomatis untuk Tampilan individual (-Controller) s : Dengan mencentang / menghapus centang opsi Auto Layout di Storyboard, perubahan diterapkan ke SEMUA pengontrol di Storyboard. (Terima kasih kepada Sava Mazăre untuk poin ini!)
Storyboard memiliki risiko lebih tinggi untuk merusak kompatibilitas mundur : Xcode terkadang mengubah format file Storyboard dan tidak menjamin dengan cara apa pun Anda akan dapat membuka file Storyboard yang Anda buat hari ini beberapa tahun atau bahkan beberapa bulan dari sekarang. (Berkat kemajuan pemikiran untuk hal ini. Lihat komentar asli )
Storyboard dapat membuat kode Anda lebih kompleks : Ketika Anda membuat pengontrol tampilan dalam kode, Anda dapat membuat init
metode khusus , misalnya initWithCustomer:
. Dengan begitu, Anda dapat membuat bagian customer
dalam pengontrol tampilan Anda tidak berubah dan memastikan bahwa pengontrol tampilan ini tidak dapat dibuat tanpa customer
objek. Ini tidak mungkin saat menggunakan Storyboards. Anda harus menunggu prepareForSegue:sender:
metode dipanggil dan kemudian Anda harus mengatur artikel yang bagus tentang masalah ini .customer
properti pada pengontrol tampilan Anda, yang berarti Anda harus membuat properti ini bisa berubah dan Anda harus membiarkan pengontrol tampilan dibuat tanpa customer
objek . Dalam pengalaman saya ini dapat sangat menyulitkan kode Anda dan membuatnya lebih sulit untuk alasan tentang aliran aplikasi Anda. Perbarui 9/9/16: Chris Dzombak menulis
Ini McDonald's : Untuk mengatakannya dalam kata-kata Steve Jobs tentang Microsoft: Ini McDonald's (video) !
Ini adalah alasan saya mengapa saya benar-benar tidak suka bekerja dengan storyboard. Beberapa alasan ini juga berlaku untuk XIB. Pada proyek-proyek berbasis storyboard yang telah saya kerjakan, mereka telah menghabiskan lebih banyak waktu daripada yang telah saya hemat dan mereka membuat hal-hal lebih rumit daripada lebih mudah.
Ketika saya membuat UI dan aliran aplikasi dalam kode, saya jauh lebih mengontrol apa yang sedang terjadi, lebih mudah untuk debug, lebih mudah untuk menemukan kesalahan sejak awal, lebih mudah untuk menjelaskan perubahan saya ke pengembang lain dan itu lebih mudah untuk mendukung iPhone dan iPad.
Namun, saya setuju bahwa meletakkan semua UI Anda dalam kode mungkin bukan solusi satu ukuran untuk semua proyek. Jika UI iPad Anda sangat berbeda dari UI iPhone Anda di tempat-tempat tertentu, mungkin masuk akal untuk membuat XIB hanya untuk area tersebut.
Banyak masalah yang diuraikan di atas dapat diperbaiki oleh Apple dan saya harap itulah yang akan mereka lakukan.
Hanya dua sen saya.
Pembaruan : Di Xcode 5, Apple mengambil opsi untuk membuat proyek tanpa Storyboard. Saya telah menulis sebuah skrip kecil yang memindahkan templat Xcode 4 (dengan opsi Storyboard-opt-out) ke Xcode 5: https://github.com/jfahrenkrug/Xcode4templates