Подтвердить что ты не робот

Когда использовать раскадровку и когда использовать XIB

Есть ли какие-либо рекомендации по использованию раскадровки в проекте iOS и когда использовать XIB? каковы плюсы и минусы каждого и в каких ситуациях они подходят?

Близко, поскольку я могу сказать, что это не так, чтобы использовать сценарии раскадровки, когда у вас есть контроллеры представлений, которые подталкиваются динамическими элементами пользовательского интерфейса (например, карты).

4b9b3361

Ответ 1

Я широко использовал XIB и выполнил два проекта с использованием раскадровки. Мои учения:

  • Раскадранты хороши для приложений с небольшим или средним количеством экранов и относительно простой навигации между представлениями.
  • Если у вас много просмотров и много перекрестной навигации между ними, то раскадровка выглядит запутанной и слишком много работает, чтобы сохранить чистоту.
  • Для большого проекта с несколькими разработчиками я бы не использовал Storiesboards, потому что у вас есть один файл для вашего интерфейса и не может легко работать параллельно.
  • Возможно, большие приложения будут разбиты на несколько файлов раскадровки, но я этого не пробовал. Этот ответ показывает, как делать segues между раскадровки.
  • Вам все еще нужны XIB: в обоих моих проектах Storyboard мне пришлось использовать XIB для пользовательских ячеек таблицы.

Я думаю, что раскадровки - это шаг в правильном направлении реализации интерфейса и надеюсь, что Apple расширит их в будущих версиях iOS. Им нужно решить проблему с одним файлом, но в противном случае они не будут привлекательными для крупных проектов.

Если я запустил приложение небольшого размера и могу позволить себе только совместимость с iOS5, я бы использовал раскадровки. Для всех остальных случаев я придерживаюсь XIB.

Ответ 2

Обновление 1/12/2016: это 2016 год, и я по-прежнему предпочитаю выкладывать свои интерфейсы в коде, а не в раскадровки. Сказано, что раскадровки прошли долгий путь. Я удалил все пункты из этого сообщения, которые просто больше не применяются в 2016 году.

Обновление 4/24/2015. Интересно, что Apple даже не использует раскадровки в своих недавно открытых источниках ResearchKit как Peter Steinberger заметил (под подзаголовком "Interface Builder" ).

Обновление 6/10/2014. Как и ожидалось, Apple продолжает улучшать раскадровки и Xcode. Некоторые из пунктов, применимых к iOS 7 и ниже, больше не применяются к iOS 8 (и теперь они помечены как таковые). Поэтому, хотя у Storyboards по-прежнему есть недостатки, я пересматриваю свой совет от не использовать для выборочно, где это имеет смысл.

Даже сейчас, когда iOS 9 отсутствует, я рекомендую против проявлять осторожность при принятии решения о том, использовать ли раскадровки. Вот мои причины:

  • Расчленения не выполняются во время выполнения, а не во время компиляции. У вас есть опечатка в названии segue или неправильно связана с вашим раскадровкой? Он взорвется во время работы. Вы используете пользовательский подкласс UIViewController, который больше не существует в вашем раскадровке? Он взорвется во время работы. Если вы делаете такие вещи в коде, вы поймаете их на ранней стадии во время компиляции. Обновление. Мой новый инструмент StoryboardLint решает эту проблему.

  • Раскадранные расстройства быстро запутываются. По мере роста вашего проекта ваш раскадровки становится все труднее ориентироваться. Кроме того, если несколько контроллеров просмотра имеют несколько сегментов для нескольких других контроллеров представлений, ваш раскадровка быстро начинает выглядеть как чаша спагетти, и вы обнаружите, что вы увеличиваете и уменьшаете масштаб и прокручиваете по всему месту, чтобы найти контроллер вида, который вы ищете для и узнать, какие точки где. Обновление. Эта проблема в основном может быть решена путем разбиения вашей раскадровки на несколько раскадровки, как описано в в этой статье от Pilky и в этой статье Роберта Брауна.

  • Раскадранты усиливают работу в команде. Поскольку у вас обычно есть только один огромный файл раскадровки для вашего проекта, наличие нескольких разработчиков, регулярно вносящих изменения в этот файл, может быть головной болью: Изменения необходимо объединить и разрешить конфликты. Когда возникает конфликт, трудно сказать, как его решить: Xcode генерирует XML файл раскадровки, и он не был разработан с целью, которую человек должен был бы прочитать, не говоря уже о его редактировании.

  • Раскадчики делают обзор кода трудным или почти невозможным. Отзывы о коллеге - отличная вещь, которую вы можете сделать в своей команде. Однако, когда вы вносите изменения в раскадровку, почти невозможно просмотреть эти изменения с помощью другого разработчика. Все, что вы можете подтянуть, - это разброс огромного XML файла. Расшифровка того, что действительно изменилось, и если эти изменения верны или если они сломали что-то, действительно сложно.

  • Storyboards препятствуют повторному использованию кода. В моих проектах iOS я обычно создаю класс, который содержит все цвета и шрифты и поля и вставки, которые я использую во всем приложении, чтобы дать ему последовательный внешний вид: это изменение одной строки, если мне нужно настроить любое из этих значений для всего приложения. Если вы устанавливаете такие значения в раскадровке, вы дублируете их и вам нужно будет найти каждое отдельное событие, когда вы хотите их изменить. Шансы высоки, что вы пропустили один, потому что там нет поиска и замены в раскадровки.

  • Для раскадровки требуются постоянные переключатели контекста: Я нахожу себя работающим и более быстрым в коде, чем в раскадровках. Когда ваше приложение использует раскадровки, вы постоянно переключаете свой контекст: "О, я хочу, чтобы на этой ячейке просмотра таблицы был загружен другой контроллер представлений. Теперь мне нужно открыть раскадровку, найти правильный контроллер просмотра, создать новый сеанс к другому контроллеру представления (который я также должен найти), дайте segue имя, запомните это имя (я не могу использовать константы или переменные в раскадровках), переключитесь обратно на код и надеюсь, что я не ошибаюсь имени что перейдите к моему методу prepareForSegue. Как бы я хотел, я просто мог бы ввести эти 3 строки кода прямо здесь, где я есть!" Нет, это не весело. Переключение между кодом и раскадрой (и между клавиатурой и мышью) быстро стареет и замедляет работу.

  • Раскалывание сложно реорганизовать. Когда вы реорганизуете свой код, вы должны убедиться, что он по-прежнему совпадает с тем, что ожидает ваша раскадровка. Когда вы перемещаете вещи в своем раскадровке, вы узнаете только во время выполнения, если он все еще работает с вашим кодом. Мне кажется, что мне нужно синхронизировать два мира. Он чувствует себя хрупким и обескураживает изменения в моем скромном мнении.

  • Раскалывание менее гибкое. В коде вы можете в основном делать все, что хотите! С раскадными версиями вы ограничены подмножеством того, что вы можете сделать в коде. Особенно, когда вы хотите сделать некоторые продвинутые вещи с анимациями и переходами, вы обнаружите, что "сражаетесь с раскадрой", чтобы заставить его работать.

  • Раскадровки не позволяют изменять тип специальных контроллеров представления. Вы хотите изменить UITableViewController на UICollectionViewController? Или в простой UIViewController? Невозможно в Раскадке. Вы должны удалить старый контроллер представления и создать новый и повторно подключить все сегменты. Это намного проще сделать с изменением кода.

  • Расторжение добавляет две дополнительные обязательства в ваш проект: (1) Инструмент редактора раскадровки, который генерирует XML раскадровки и (2) компонент времени выполнения, который анализирует XML и создает пользовательский интерфейс и контроллер объекты из него. Обе части могут иметь ошибки, которые вы не можете исправить.

  • Раскадровки не позволяют добавить под просмотр к UIImageView: кто знает, почему.

  • Раскадранные страницы не позволяют включать автоматическую компоновку для отдельного вида (-контроль) s: путем проверки/снятия флажка с опцией автоматического макета в раскадровке, это изменение применяется ко всем контроллеров в раскадровке. (Спасибо Саве Мазэре за это!)

  • Раскалы имеют более высокий риск разрушения обратной совместимости. Xcode иногда меняет формат файла раскадровки и не гарантирует, что вы сможете открывать файлы раскадровки, которые вы создаете сегодня несколько лет или даже месяцев. (Спасибо за внимание за этот момент. См. Оригинальный комментарий)

  • Раскадровки могут сделать ваш код более сложным. При создании контроллеров представления в коде вы можете создавать собственные методы init, например initWithCustomer:. Таким образом, вы можете сделать customer внутри вашего контроллера просмотра неизменным и убедиться, что этот контроллер представления не может быть создан без объекта customer. Это невозможно при использовании раскадровки. Вам придется подождать, пока будет вызываться метод prepareForSegue:sender:, а затем вам нужно будет установить свойство customer на вашем контроллере представления, что означает, что вы должны сделать это свойство изменчивым, и вам нужно будет разрешить контроллер вида который будет создан без объекта customer. По моему опыту это может значительно усложнить ваш код и затрудняет рассуждение о потоке вашего приложения. Обновление 9/9/16: Крис Дзамбак написал отличную статью об этой проблеме.

  • Это McDonald's. Чтобы сказать это в словах Стива Джобса о Microsoft: Это McDonald (видео)

Вот мои причины, почему мне действительно не нравится работать с раскадрой. Некоторые из этих причин также применимы к XIB. На проектах, основанных на раскадровке, над которыми я работал, они обошлись мне гораздо больше времени, чем они спасли, и вместо этого они упростили ситуацию.

Когда я создаю свой интерфейс и поток приложений в коде, я гораздо больше контролирую происходящее, его легче отлаживать, легче обнаружить ошибки на ранней стадии, легче объяснить мои изменения другим разработчиков, и проще поддерживать iPhone и iPad.

Однако я согласен с тем, что изложение всего вашего пользовательского интерфейса в коде может быть не единственным решением для всех проектов. Если ваш iPad UI сильно отличается от вашего iPhone UI в определенных местах, может возникнуть смысл создать XIB только для этих областей.

Многие проблемы, описанные выше, могут быть исправлены Apple, и я надеюсь, что то, что они будут делать.

Только мои два цента.

Обновление. В Xcode 5 Apple убрала возможность создания проекта без раскадровки. Я написал небольшой script, который содержит порты Xcode 4 шаблонов (с опцией Отклонения от раскадровки) до Xcode 5: https://github.com/jfahrenkrug/Xcode4templates

Ответ 3

Разрушители были созданы, чтобы помочь разработчикам визуализировать их приложение и поток приложения. Это очень похоже на наличие буфера xib, но в одном файле.

Возникает вопрос, похожий на этот расположенный В чем разница между .xib файлом и .storyboard?.

Вы также можете создавать пользовательские переходы с помощью кода, который будет динамически изменяться, если это необходимо, так же, как вы можете с помощью .xibs.

ПЛЮСЫ:

  • Вы можете макетировать поток приложения, не пиши много, если какой-либо код.
  • Намного легче увидеть переходы между экранами и потоком приложений.
  • Также можно использовать .xibs, если необходимо, с раскадными версиями.

МИНУСЫ:

  • Работает только с iOS 5+. Не работает с iOS4.
  • Может быть легко загроможден, если у вас очень привлекательное приложение.

На самом деле нет правильного/неправильного, когда использовать тот или иной, это просто вопрос предпочтения и какие версии iOS вы хотите использовать.

Ответ 4

Я просто сформулирую 4 простых причины, почему вы должны использовать раскадровки, особенно в продуктивной среде, где вам нужно работать в команде владельцев продуктов, менеджеров продуктов, Дизайнеры UX и т.д.

  • Apple имеет БОЛЬШО улучшенную работу с раскадровки.. И они поощряют вас работать с ними. Это означает, что не будет нарушать существующие проекты с помощью обновлений, они гарантируют, что раскадровки будут в будущем доказательством для новых версий XCode/iOS.
  • Более заметные результаты в меньше времени для владельцев и менеджеров продуктов даже на этапе создания. Вы даже можете использовать раскадровку как диаграмму экрана и обсуждать ее на собраниях.
  • Даже после того, как приложение выполнено (и что обычно начинается его жизненный цикл) - в будущем он будет быстрее и проще применять небольшие корректировки. И они могут очень хорошо изменить несколько аспектов вашего макета в одно и то же время, что вы, вероятно, захотите увидеть в стиле WYSIWYG. Альтернативой было бы ручное редактирование пользовательских интерфейсов кода и переключение между IDE и симулятором, чтобы проверить его, каждый раз ожидая компиляции и сборки.
  • Не-разработчикам можно научить настраивать макеты в раскадровки и создавать необходимые крючки для разработчиков (IBOutlets и IBActions). Это очень большой плюс, потому что он позволяет разработчикам сосредоточиться на логике, а дизайнеры UX применяют свои изменения визуально, без необходимости писать какой-либо код вообще.

Я не буду писать какую-либо CONS, поскольку Йоханнес уже перечислял, вероятно, все жизнеспособные в своем ответе. И большинство из них определенно не являются жизнеспособными, особенно не с основными улучшениями XCode6.

Ответ 5

Я не думаю, что есть правильный ответ на ваш вопрос, это просто вопрос личного опыта и того, с чем вы чувствуете себя более комфортно.

По-моему, раскадровки - отличная вещь. Это правда, очень сложно выяснить, почему ваше приложение сбивает сбой во время выполнения, но через некоторое время и опыт вы поймете, что он всегда связан с отсутствием какого-либо IBOutlet, и вы сможете легко его исправить.

Единственная реальная проблема - работа в команде по контролю версий с раскадными версиями, на ранних стадиях развития это может быть настоящим беспорядком. Но после этого первого этапа обновления пользовательского интерфейса, которые полностью меняют раскадровку, очень редки, и в большинстве случаев вы заканчиваете конфликты в самых последних частях xml, которые представляют собой ссылки, которые обычно автофиксируют сами, когда вы повторно открываете раскадровку, В нашей команде мы предпочитали иметь дело с этим, а не с тяжелыми контроллерами обзора с тоннами кода просмотра.

Я прочитал много комментариев, снова запустив auto-layout. С XCode5 он стал действительно улучшенным, он действительно хорош даже для авторотирования макетов. В некоторых случаях вам придется что-то делать в коде, но вы можете просто отключить ограничение, которое вам нужно отредактировать, и в этот момент сделать то, что вам нужно в вашем коде. Даже анимируйте их.

Я также думаю, что большинство людей, которые не любят раскадровки, не пытались полностью понять силу настраиваемого ручного segue, где вы можете полностью настроить (в одном файле) способ перехода от пути к другому и также (с некоторыми трюками) даже повторно использовать ранее загруженный контроллер просмотра, просто обновив его содержимое просмотра, а не полностью перезагрузив все это. В конце вы действительно можете делать то же самое, что и в коде, но я думаю, что у вас есть лучшее разделение проблем с раскадровки, но я согласен, что во многих случаях у них нет функций (шрифты, изображение в качестве цветного фона, ecc...).

Ответ 6

Я не использую StoryBoard или XIB в моем приложении, но создаю все программно.

Δ Преимущества:

√ Вы можете создать любой сложный тип пользовательского интерфейса или анимации перехода для UIView.

√ Поддержка всех версий iOS. Не нужно беспокоиться о < iOS 5.

√ * Ваше приложение будет поддерживать все устройства iPhone/iPod/iPad в вашем коде.

√ Вы всегда обновляетесь, так как знаете код, который всегда будет работать.

√ * Будет работать на любом (новом) устройстве - не нужно менять код.

√ Все зависит от вас. В определенном месте вы хотите что-то изменить - нет необходимости смотреть в раскадровку или xib. Просто найдите его в определенном классе.

√ Последний, но не список. Вы никогда не забудете это, как управлять всем программным путем. Это лучшая вещь, поскольку вы знаете контроль очень глубоко, чем кто-либо.

Я никогда не сталкивался с проблемой, не используя SB или XIB, поскольку мне хорошо с этим.

*, если вы установили рамки объекта UIKit в соответствии с размером экрана.

<суб > P.S. Если вы все еще не сделали этого - вы можете столкнуться с трудностями (или можете чувствовать себя скучно), но как только вы узнаете об этом - это действительно Candy для вас.

Ответ 7

Если вы собираетесь заботиться о производительности раскадровки, смотрите WWDC 2015 Session 407

введите описание изображения здесь

Время сборки

Когда сборщик интерфейсов компилирует раскадровку, он делает две вещи во-первых, он пытается максимизировать производительность вашего приложения и во-вторых, это также минимизирует количество созданных файлов nib.

Если у меня есть контроллер вида с представлением и кучей суб-представлений, построитель интерфейса, время сборки создаст файл nib для диспетчер представлений и создайте файл nib для представления.

Имея отдельные файлы nib как для контроллера представления, так и для view, это означает, что иерархия представления может быть загружена по требованию.

Время выполнения

Когда вы выделяете экземпляр раскадровки, используя раскладку пользовательского интерфейса, API, первоначально все, на что вы выделяете память, - это раскадровка пользовательского интерфейса сам экземпляр.

Нет диспетчеров просмотра пока нет.

Когда вы создаете экземпляр своего исходного контроллера представления, он загружает наконечник для этого начального контроллера представления, но, опять же, никакая иерархия представления не имеет был загружен до тех пор, пока кто-то не попросит об этом.

Ответ 8

Я работал над проектом с разумным размером ( > 20 сцен в языке раскадровки) и сталкивался со многими ограничениями и должен постоянно переходить к документации и поисковым запросам Google, чтобы делать что-то.

  • Пользовательский интерфейс находится в одном файле. Даже если вы создаете несколько раскадровки, у вас все еще есть много сцен/экранов в каждом раскадровке. Это проблема в средних группах.

  • Во-вторых, они не очень хорошо работают с пользовательскими контроллерами контейнеров, которые внедряют другие контроллеры контейнеров и т.д. Мы используем MFSlideMenu в приложении с вкладками, а в сцене есть таблица. Это почти невозможно сделать с раскадровки. Проведя несколько дней, я прибег к выполнению метода XIB, где есть полный контроль.

  • IDE не позволяет выбирать элементы управления в увеличенном состоянии. Таким образом, в большом проекте уменьшение масштаба - это в основном получение высокого уровня и не более того.

Я бы использовал раскадровки для небольших приложений с небольшими размерами групп и использовал подход XIB для средних команд/проектов.