Оновлення 12.01.2016 : 2016 рік, і я все ще вважаю за краще розміщувати свої інтерфейси користувача у коді, а не в дошках розповідей. Коли це було сказано, Дошки розповідей пройшли довгий шлях. Я зняв усі пункти з цієї публікації, які просто більше не застосовуються у 2016 році.
Оновлення 24.04.2015 : Цікаво, що Apple навіть не використовує дошки розкад у своїх нещодавно відкритих джерелах ResearchKit, як зауважив Пітер Штейнбергер (у підрубриці "Builder інтерфейсу").
Оновлення 6.10.2014 : Як і очікувалося, Apple продовжує вдосконалювати дошки розкад та Xcode. Деякі моменти, застосовані до iOS 7 і нижче, вже не стосуються iOS 8 (і тепер позначені як такі). Тож, хоча споріднені дошки по суті все ще мають недоліки, я переглядаю свої поради від використання не вибіркового використання там, де це має сенс .
Навіть зараз, коли iOS 9 не працює, я б порадив протибудьте обережні при вирішенні питання про те, чи використовувати Стілборди. Ось мої причини:
Не вдалося виконати рекламні дошки під час виконання, а не під час компіляції . У вас є помилка друку в назві Segue або неправильно пов’язано його у своїй дошці розкадрувань? Він підірветься під час виконання. Ви використовуєте спеціальний підклас UIViewController, який більше не існує у вашій дошці? Він підірветься під час виконання. Якщо ви робите такі речі в коді, ви їх будете ловити на початку, під час компіляції. Оновлення : мій новий інструмент StoryboardLint в основному вирішує цю проблему.
Дошка розкадрувань швидко стає заплутаною : Коли ваш проект зростає, ваші розкадровки стає все складніше орієнтуватися. Крім того, якщо в декількох контролерах перегляду є декілька відомих даних до кількох інших контролерів перегляду, ваша архівна панель швидко починає виглядати як чаша спагетті, і ви виявите, що ви збільшуєте та зменшуєте та прокручуєте всюди місце, щоб знайти контролер перегляду, який ви шукаєте для того, щоб дізнатись, які точки зору де. Оновлення : цю проблему здебільшого можна вирішити, розділивши дошку розкадрування на кілька дощок розкадрувань, як описано у цій статті Пілкі та цій статті Роберта Брауна .
Робочі дошки роблять роботу в команді важче : оскільки у вас зазвичай є лише один величезний файл розкадрівки для вашого проекту, тому що кілька розробників регулярно вносять зміни в один файл можуть стати головним болем: зміни потрібно об'єднати і вирішити конфлікти. Коли виникає конфлікт, важко сказати, як його вирішити: Xcode генерує XML-файл файлу розкадровки, і він насправді не був розроблений з метою, що людині доведеться читати, не кажучи вже про її редагування.
Оглядові дошки роблять огляд коду важким або майже неможливим : рецензування кодового кодексу - це велика річ, яку потрібно зробити для вашої команди. Однак, коли ви вносите зміни в дошку розкадрувань, переглянути ці зміни майже неможливо з іншим розробником. Все, що ви можете знайти - це різний величезний XML-файл. Розшифрувати, що насправді змінилося, і якщо ці зміни є правильними, або якщо вони щось порушили, насправді важко.
Дошка розгортання перешкоджає повторному використанню коду . У своїх проектах iOS я зазвичай створюю клас, який містить усі кольори та шрифти та поля та вставки, які я використовую в додатку, щоб надати йому послідовний вигляд і відчуття: це зміна одного рядка, якщо мені доведеться відрегулюйте будь-яке з цих значень для всього додатка. Якщо ви встановите такі значення в дошці розкадрувань, ви дублюєте їх і потрібно буде знайти кожне виникнення, коли потрібно змінити їх. Висока ймовірність того, що ви пропустите його, оскільки в пошукових скриньках немає пошуку та заміни.
Дошка розкатувань вимагає постійних контекстних комутацій : я вважаю, що я працюю та переходжу набагато швидше в коді, ніж у дошках. Коли ваш додаток використовує розкадровки, ви постійно перемикаєте свій контекст: "О, я хочу натиснути на цю клітинку перегляду таблиці, щоб завантажити інший контролер перегляду. Тепер мені потрібно відкрити дошку, знайти потрібний контролер перегляду, створити новий segue іншому контролеру перегляду (що я також повинен знайти), дайте ім'я segue, запам’ятайте це ім’я (я не можу використовувати константи чи змінні в раскадровках), поверніться до коду і сподіваюся, що я не введу помилкове ім’я що відомий для мого методу PrepaForSegue. Як я хотів би просто ввести ці 3 рядки коду саме там, де я є! " Ні, це не весело. Перемикання між кодом та розгорткою (та між клавіатурою та мишею) швидко старіє і сповільнює вас.
Дошка розкадрувань важко переробити : Коли ви перефактуруєте код, ви повинні переконатися, що він все ще відповідає тому, що очікує ваша розкадровка. Коли ви переміщуєте речі на своїй раскадровці, під час виконання роботи ви дізнаєтесь лише, якщо вона все ще працює з вашим кодом. Мені здається, ніби мені доводиться синхронізувати два світи. Це відчуває крихкість і відлякує зміни в моїй скромній думці.
Рекламні дошки менш гнучкі : в коді ви в основному можете робити все, що завгодно! За допомогою розповідей ви обмежені підмножиною того, що ви можете зробити в коді. Особливо, коли ви хочете зробити якісь передові речі з анімацією та переходами, ви опинитеся на тому, що ви "бороєтесь із розкладовою", щоб змусити її працювати.
Рекламні дошки не дозволяють вам змінити тип спеціальних контролерів перегляду : Ви хочете змінити " UITableViewController
a" UICollectionViewController
? Або на рівнину UIViewController
? Неможливо на Дошці розкадрувань. Потрібно видалити старий контролер перегляду та створити новий і знову підключити всі сайти. Набагато простіше зробити таку зміну коду.
Дошки оголошень додають до вашого проекту два додаткових зобов’язання : (1) Інструмент "Редактор розгортки", який генерує XML раскадровки та (2) компонент часу виконання, який розбирає XML і створює з нього об'єкти інтерфейсу та контролера. В обох частинах можуть бути помилки, які ви не можете виправити.
Рекламні дошки не дозволяють додавати підвідмову доUIImageView
: Хто знає чому.
Дошки розгортання не дозволяють вам вмикати автоматичний макет для окремих переглядів (-контролера) : Перевіряючи / знімаючи прапорець параметр Автоматичний макет на Дошці розкад, зміна застосовується до ВСІХ контролерів на Розгортці. (Дякую Саві Мазаре за цей момент!)
Дошки розгортання мають більший ризик порушення сумісності назад : Xcode іноді змінює формат файлу Storyboard і жодним чином не гарантує, що ви зможете відкривати файли Storyboard, які ви створюєте сьогодні, через кілька років або навіть місяців. (Завдяки хочамзначенням цього пункту. Дивіться оригінальний коментар )
Рекламні дошки можуть зробити ваш код складнішим : Коли ви створюєте свої контролери подання в коді, ви можете створювати власні init
методи, наприклад initWithCustomer:
. Таким чином, ви можете зробити customer
внутрішню частину контролера перегляду непорушною і переконатися, що цей контролер подання не може бути створений без customer
об'єкта. Це неможливо при використанні дощок. Вам доведеться почекати виклику prepareForSegue:sender:
методу, і тоді вам доведеться встановити customer
властивість на контролері перегляду, а це означає, що ви повинні зробити цю властивість зміною, і вам доведеться дозволити створення контролера перегляду без customer
об'єкта . На мій досвід, це може значно ускладнити ваш код і ускладнити міркування про потік вашої програми. Оновлення 9.9.16: Кріс Джомбак написав чудову статтю про цю проблему .
Це Макдональдс : сказати це словами Стіва Джобса про Microsoft: це Макдональдс (відео) !
Це мої причини, чому мені дуже не подобається працювати з розповідями. Деякі з цих причин стосуються і XIB. Щодо проектів на основі розповідей, над якими я працював, вони коштували мені набагато більше часу, ніж заощадили, і вони ускладнювали речі, а не легші.
Коли я створюю свій код інтерфейсу користувача та програми в коді, я набагато більше контролюю те, що відбувається, простіше налагоджувати, легше виявляти помилки на початку, легше пояснити свої зміни іншим розробникам, і це легше підтримувати iPhone та iPad.
Однак я погоджуюся з тим, що розміщення всього вашого інтерфейсу в коді може не бути рішенням одного розміру для кожного проекту. Якщо ваш інтерфейс iPad в певних місцях сильно відрізняється від інтерфейсу вашого iPhone, може бути доцільним створити XIB лише для цих областей.
Багато проблем, викладених вище, можуть виправити Apple, і я сподіваюся, що саме це і зробить.
Всього два мої центи.
Оновлення : У Xcode 5 Apple відібрала можливість створити проект без дошки сповіщення. Я написав невеликий сценарій, який переносить шаблони Xcode 4 (з опцією відмови від розгортки) на Xcode 5: https://github.com/jfahrenkrug/Xcode4templates