Обновление 1/12/2016 : сейчас 2016 год, и я все еще предпочитаю размещать свои интерфейсы в коде, а не в раскадровке.При этом раскадровки прошли долгий путь.Я удалил все пункты из этого поста, которые просто больше не применяются в 2016 году.
Обновление 4/24/2015 : Интересно, что Apple даже не использует раскадровки в своих недавно открытыхИсточник ResearchKit as Питер Штейнбергер заметил (в подзаголовке «Интерфейсный конструктор»).
Обновление 6/10 / 2014 : Как и ожидалось, Apple продолжает улучшать раскадровки иXcode.Некоторые из пунктов, которые применяются к iOS 7 и ниже, больше не применяются к iOS 8 (и теперь помечены как таковые).Таким образом, хотя раскадровки по-прежнему имеют недостатки, я пересматриваю свой совет с не использовать до выборочно использовать там, где это имеет смысл .
Даже сейчас, когда iOS 9 вышла, я бы посоветовал против проявлять осторожность при принятии решения о том, использовать ли раскадровки.Вот мои причины:
Раскадровки дают сбой во время выполнения, а не во время компиляции : У вас есть опечатка в имени segue или вы неправильно ее связали в вашей раскадровке?Это взорвется во время выполнения.Вы используете пользовательский подкласс UIViewController, которого больше нет в вашей раскадровке?Это взорвется во время выполнения.Если вы делаете такие вещи в коде, вы поймаете их на раннем этапе, во время компиляции. Обновление : Мой новый инструмент StoryboardLint в основном решает эту проблему.
Раскадровки быстро сбивают с толку : с ростом вашего проекта навигация по раскадровке становится все более сложной.Кроме того, если несколько контроллеров представления имеют несколько переходов к нескольким другим контроллерам представления, ваша раскадровка быстро начинает выглядеть как чаша спагетти, и вы обнаружите, что увеличиваете и уменьшаете масштаб и прокручиваете всюду, чтобы найти контроллер представления, который вы ищетедля и выяснить, что Segue указывает, где. Обновление : эту проблему в основном можно решить, разбив раскадровку на несколько раскадровок, как описано в этой статье Пилки и этой статье РобертаКоричневый .
Раскадровки усложняют работу в команде : поскольку у вас обычно есть только один огромный файл раскадровки для вашего проекта, когда несколько разработчиков регулярно вносят измененияодин файл может быть головной болью: необходимо объединить изменения и разрешить конфликты.Когда возникает конфликт, трудно сказать, как его разрешить: Xcode генерирует XML-файл раскадровки, и он на самом деле не был разработан с той целью, чтобы человеку пришлось читать, не говоря уже о его редактировании.
Раскадровки делают проверки кода трудными или почти невозможными : Проверки кода коллег - отличная вещь для вашей команды.Однако, когда вы вносите изменения в раскадровку, практически невозможно просмотреть эти изменения у другого разработчика.Все, что вы можете получить - это разбор огромного XML-файла.Расшифровка того, что действительно изменилось, и если эти изменения верны или что-то сломали, действительно сложно.
Раскадровки мешают повторному использованию кода : В моих проектах iOS я обычно создаюкласс, который содержит все цвета, шрифты, поля и вставки, которые я использую в приложении для придания ему единообразного внешнего вида: изменение в одну строку, если мне нужно настроить любое из этих значений для всего приложения.Если вы устанавливаете такие значения в раскадровке, вы дублируете их, и вам нужно будет найти каждый случай, когда вы захотите изменить их.Скорее всего, вы пропустите один, потому что в раскадровке нет поиска и замены.
Раскадровки требуют постоянных переключателей контекста : я работаю и ориентируюсь в коде гораздо быстрее, чем в раскадровках.Когда ваше приложение использует раскадровки, вы постоянно переключаете свой контекст: «О, я хочу нажать на эту ячейку табличного представления, чтобы загрузить другой контроллер представления. Теперь мне нужно открыть раскадровку, найти правильный контроллер представления, создать новый переход».другому контроллеру представления (который я также должен найти), дайте имя segue, запомните это имя (я не могу использовать константы или переменные в раскадровках), переключитесь обратно на код и надеюсь, что я не опечатал имячто за мой метод prepareForSegue. Как бы я хотел, чтобы я мог просто набрать эти 3 строки кода прямо здесь, где я нахожусь! "Нет, это не весело.Переключение между кодом и раскадровкой (а также между клавиатурой и мышью) устареет и замедляет работу.
Раскадровки трудно реорганизовать : Когда вы реорганизуете код,Вы должны убедиться, что он по-прежнему соответствует тому, что ожидает ваша раскадровка.Когда вы перемещаете вещи в своей раскадровке, вы только узнаете во время выполнения, работает ли он с вашим кодом.Мне кажется, что мне нужно синхронизировать два мира.Это кажется хрупким и мешает измениться по моему скромному мнению.
Раскадровки менее гибкие : В коде вы можете делать все, что захотите!С раскадровками вы ограничены подмножеством того, что вы можете делать в коде.Особенно, если вы захотите сделать некоторые сложные вещи с анимацией и переходами, вы обнаружите, что «боретесь с раскадровкой», чтобы заставить ее работать.
Раскадровки не позволяют вам менятьтип специальных контроллеров представления : вы хотите изменить UITableViewController
на UICollectionViewController
?Или в простой UIViewController
?Невозможно в раскадровке.Вы должны удалить старый контроллер представления и создать новый и повторно соединить все переходы.Гораздо проще сделать такое изменение в коде.
Раскадровки добавляют к вашему проекту два дополнительных обязательства : (1) Инструмент редактора раскадровки, который генерирует XML раскадровкии (2) компонент времени выполнения, который анализирует XML и создает из него объекты пользовательского интерфейса и контроллера.Обе части могут иметь ошибки, которые вы не можете исправить.
Раскадровки не позволяют добавить подпредставление к UIImageView
: Кто знает, почему.
Раскадровки не позволяют включать автоматическое расположение для отдельного представления (-Controller). S : установив / сняв флажок «Автоматическое расположение в раскадровке», изменение применяется ко ВСЕМ контроллерам в раскадровке.(Спасибо Сава Мазаре за этот пункт!)
Раскадровки имеют более высокий риск нарушения обратной совместимости : Xcode иногда меняет формат файла раскадровки и не гарантируетлюбым способом, которым вы сможете открывать файлы Storyboard, которые вы создаете сегодня, через несколько лет или даже месяцев.(Спасибо за достижения в этом вопросе. См. Оригинальный комментарий )
Раскадровки могут сделать ваш код более сложным : при создании представленияКонтроллеры в коде, вы можете создавать собственные init
методы, например initWithCustomer:
.Таким образом, вы можете сделать customer
внутри вашего контроллера представления неизменным и убедиться, что этот контроллер представления не может быть создан без объекта customer
.Это невозможно при использовании раскадровок.Вам нужно будет дождаться вызова метода prepareForSegue:sender:
, а затем вам нужно будет установить свойство customer
на вашем контроллере представления, что означает, что вы должны сделать это свойство изменяемым, и вы должны будете разрешить контроллер представлениябыть созданным без объекта customer
.По моему опыту, это может значительно усложнить ваш код и усложнить процесс рассмотрения вашего приложения. Обновление 9/9/16 : Крис Джомбак написал отличную статью об этой проблеме .
Это McDonald's : Скажу это словами Стива Джобса о Microsoft: Это McDonald's (видео) !
Вот мои причины, почему мне действительно не нравится работать с раскадровками. Некоторые из этих причин также относятся к XIB. В проектах, основанных на раскадровке, над которыми я работал, они стоили мне гораздо больше времени, чем они экономили, и они усложняли, а не упрощали вещи.
Когда я создаю свой пользовательский интерфейс и поток приложений в коде, я гораздо больше контролирую происходящее, легче отлаживать, легче обнаружить ошибки на ранних этапах, легче объяснить мои изменения другим разработчики и проще поддерживать iPhone и iPad.
Тем не менее, я согласен, что размещение всего вашего пользовательского интерфейса в коде может не быть универсальным решением для всех проектов. Если пользовательский интерфейс iPad в некоторых местах сильно отличается от пользовательского интерфейса iPhone, возможно, имеет смысл создать XIB только для этих областей.
Многие из вышеперечисленных проблем могут быть устранены Apple, и я надеюсь, что именно так они и будут.
Только мои два цента.
Обновление : В Xcode 5 Apple убрала возможность создания проекта без раскадровки. Я написал небольшой скрипт, который переносит шаблоны Xcode 4 (с опцией Storyboard-opt-out) в Xcode 5: https://github.com/jfahrenkrug/Xcode4templates