Каковы преимущества использования раскадровок вместо файлов XIB в программировании iOS? - PullRequest
70 голосов
/ 31 января 2012

Каковы основные различия между использованием раскадровок и файлов XIB.

В частности, Каковы преимущества или недостатки использования раскадровки?

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

Ответы [ 12 ]

83 голосов
/ 31 января 2012

Раскадровка:

  • Контейнер для всех ваших сцен (контроллеры представления, контроллеры Nav, контроллеры TabBar и т. Д.)
  • Менеджер соединений и переходов между этими сценами (они называются Segues)
  • Хороший способ управлять тем, как разные контроллеры общаются друг с другом
  • Раскадровки дают вам полный обзор потока вашего приложения, который вы никогда не сможете получить из отдельных файлов пера, плавающих вокруг.
  • Редуктор всех "беспорядков", возникающих, когда у вас есть несколько контроллеров, каждый со своим собственным nib-файлом.

Я уже некоторое время использую раскадровки, и ЕДИНСТВЕННЫМ недостатком является то, что вы не можете ориентироваться на iOS 4 или ниже. Раскадровки работают только на устройствах под управлением iOS 5 или выше. Помимо этого, преимуществ много, а недостатков не существует ИМО.

Лучший урок, который я видел, это Ray Wenderlich's

Кроме того, если вы являетесь участником программы Apple Developer, посмотрите прошлогоднюю сессию WWDC на раскадровках (iTunesU), это потрясающе.

Еще один замечательный (также в iTunesU) - новейший курс по программированию приложений для Стэнфордского iOS.

52 голосов
/ 25 июня 2012

Есть не только плюсы в раскадровке, но и минусы - только потому, что вы попросили ввести:

  • Нелегко работать с SB в команде, так как только один участник может работать с SB одновременно (потому что это один файл).

-Не верно: - если вам нужно сделать то, что SB не предлагает, смешать SB с программно созданными представлениями не так просто (ну, это возможно)

Эмпирическое правило выглядит так: чем сложнее вы ожидаете получить свой проект, тем больше вам лучше не идти на SB.

EDIT: - еще один недостаток SB: обходить все досадные ошибки XCode относительно SB. Например. необходимость часто очищать папку DerivedData из-за нескольких несоответствий. Иногда файлы раскадровки или ссылки на них повреждены. Тогда вы можете испытать радость от поиска проблемы. Взгляните на эту ветку , чтобы получить идею

РЕДАКТИРОВАТЬ 2 (март 2013 г.): тем временем раскадровки и Xcode работают намного лучше, а документация и лучшие практики широко распространены. Я думаю, что работа с раскадровкой может быть рекомендована для большинства проектов, даже если есть некоторые глюки.

РЕДАКТИРОВАТЬ 3 (сентябрь 2013 г.): теперь с новым форматом Xcode 5 работа в командах с SB может стать еще лучше, поскольку представляется возможным объединить SB-код гораздо проще.

Еще одно РЕДАКТИРОВАНИЕ: ну, если у вас есть час времени, расслабьтесь, расслабьтесь и слушайте этих парней, обсуждающих эту тему (Рэй Вендерлих и Ко)

Редактировать 2016.1: после того, как я долгое время был сторонником раскадровки, у меня было так много хлопот с ним в последние месяцы, что я решил отказаться от раскадровки как можно дальше. Причина в том, что Apple добавляет такую ​​функцию, как глупость, но не заботится об ошибках и недостатках. Производительность с множеством ограничений автоматического размещения очень плохая (в то время как время разработки), и подверженность ошибкам стала огромной. Пример: еще менее сложные раскадровки имеют тенденцию переходить в «грязный режим» сразу после открытия проекта в Xcode (см. Состояние git). Совет: как новичок вы полюбите раскадровки, так как вы можете быстро создавать прототипы и запускать их без большого количества кода. Когда вы войдете в промежуточное состояние, вы добавите больше кода GUI в свой проект. Теперь вы начинаете перемещаться между кодом и SB - и все начинает работать хуже. Рано или поздно вы будете склонны выполнять большую часть графического интерфейса в коде, потому что результат более предсказуем, чем наличие нескольких источников.

8 голосов
/ 22 июня 2015

Резюме

Файлы Nibs / .xib и раскадровки - это файлы Interface Builder, которые используются для визуального создания пользовательского интерфейса для приложений iOS и Mac в Xcode (я буду использовать терминологию iOS для классов, так как этот вопрос помечен как iOS, но также относится к Программирование на Mac).

Отличия

Перья предназначены для использования с одним UIView. Они также могут быть подключены к подклассу UIViewController, установив класс Владельца файла на любой подкласс UIViewController и подключив выходное представление (перетащите для подключения с помощью Инспектора соединений в крайней правой панели XCode).

Раскадровки должны содержать пользовательский интерфейс для 1 или более UIViewController. Вы можете создать весь пользовательский интерфейс в одной раскадровке или разделить его на более мелкие части.

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

Раскадровки всегда следует использовать в пользу файлов .xib / Nibs (для контроллеров представления). Раскадровки имеют больше функций и активно разрабатываются Apple.

Каждый аргумент в пользу Nibs основан на том факте, что они использовались индивидуально, в то время как раскадровки содержат много сцен. Вы можете использовать одну раскадровку для каждого UIViewController так же легко, как и для Nibs (см. Примеры кода ниже). Продолжайте читать для подробного объяснения и примеров кода.

* * Подробное тысячу двадцать-один * * тысяча двадцать-дв

Почему Storboards превосходят Nibs?

Ответ в основном сводится к тому, что Apple поощряет использование раскадровок и прилагает к ним больше усилий при разработке.

  1. Раскадровки имеют возможность масштабирования, которой нет у Nibs. Серьезно, вы вообще не можете увеличивать масштаб изображения в Nibs, которые отстой при проектировании больших экранов на маленьком ноутбуке.
  2. В перьях отсутствуют ключевые функции, такие как:
    • Прототип и динамические ячейки для UITableView ( подробнее )
    • Свойство top layout свойство (см. Комментарий)
    • Возможно, есть еще что-то, пожалуйста, отредактируйте или прокомментируйте, если вам есть что добавить в этот список
  3. Вам не нужно возиться с установкой класса владельца файла.

Основной аргумент против раскадровок заключается в том, что наличие всех ваших контроллеров представлений в одном месте приводит к конфликтам слияния, медленному Xcode, медленному времени сборки и является общей проблемой при обслуживании. Следовательно, общий совет - использовать перо для каждого UIViewController.

Но ... Вы можете просто создать раскадровку для каждого UIViewController. Обычная практика (по крайней мере для меня) - скрывать всю инициализацию UIViewController в методе класса (поскольку никакой другой класс не должен знать имя файла, в котором находится Nib / Storyboard контроллера). Давайте сравним фрагменты кода, которые можно использовать для создания такого метода. Одна строка кода - это полная разница между ними.

Objective-C

Раскадровка

+ (ViewController *)create
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"ViewController" bundle:nil];
    return [storyboard instantiateInitialViewController];
}

Nib

+ (ViewController *)create
{
    return [super initWithNibName:@"ViewController" bundle:nil];
}

Использование

- (void)showMyViewController
{
    ViewController *vc = [ViewController create];
    [self presentViewController:vc animated:YES completion:nil];
}

Swift

Раскадровка

static func create() -> ViewController {
    let storyboard = UIStoryboard(name: "ViewController", bundle: NSBundle.mainBundle())
    return storyboard.instantiateInitialViewController() as! ViewController
}

Nib

static func create() -> ViewController {
    return ViewController(nibName: "ViewController", bundle: nil)
}

Использование

func showMyViewController() {
    let vc = ViewController.create()
    self.presentViewController(vc, animated: true, completion: nil)
}

Аргументы

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

  1. Команды и слияния

Аргумент: наличие раскадровки с большим количеством контроллеров представления вызвать конфликты слияния, если вы работаете в команде с несколькими люди, делающие изменения

Ответ: Одна раскадровка вызывает не больше конфликтов слияния, чем один Nib

  1. Сложность

Аргумент: Очень сложные приложения имеют много сцен в раскадровке, что приводит к гигантской раскадровке, которая загружается вечно и едва понятна из-за своего размера.

Ответ: Это замечательный момент, но вы можете легко разбить раскадровки на более мелкие части. Ссылки на раскадровку выглядят как отличная функция, которую можно использовать для связывания раскадровок, но они доступны только в Xcode 7 / iOS 9+.Кроме того, до сих пор нет причин выбирать отдельные перья вместо раскадровок.

Возможность повторного использования

Аргумент: Создание пера для каждого подкласса UIViewController позволяет повторно использовать код, поэтому вам не нужно настраивать все свои ограничения и выходы для каждой сценыв вашей раскадровке.

Ответ: Опять же, нет причины выбирать отдельные перья над отдельными раскадровками.

5 голосов
/ 31 января 2012

Была прекрасная презентация о раскадровке , которая была дана на встрече LiDG пару месяцев назад.

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

4 голосов
/ 03 февраля 2014

Еще несколько преимуществ раскадровок:

  • Раскадровки имеют улучшенную поддержку табличных представлений. То есть вы можете использовать Ячейки «Динамический» и «Прототип».
  • Проще создавать экземпляры контроллеров представления, используя раскадровки. Вы можете сделать что-то вроде: [se lf.storyboard instantiateViewControllerWithIdentifer:]
  • Раскадровки поддерживают контейнеры контроллеров представления, поэтому вы можете расположить дочерние контроллеры представления графически.

Недостатки:

  • Раскадровки медленно отрисовываются в XCode, когда они содержат много контроллеров представления

  • Autolayout не может быть включен для одного контроллера представления в раскадровке.

3 голосов
/ 01 февраля 2012

Будьте осторожны, если вы используете раскадровки, ваше приложение не совместимо с предыдущими версиями ОС.

2 голосов
/ 31 января 2012

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

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

1 голос
/ 25 июля 2018

Раскадровки имеют гораздо больше проблем, чем преимуществ.Вот список их проблем, скопированный из iraycd :

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

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

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

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

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

  • Раскадровки заставляют вас делать все дважды : Вы создаете универсальное приложение, которое работает как на iPad, так и на iPhone?Когда вы используете раскадровки, у вас обычно будет одна раскадровка для версии для iPad и одна для версии для iPhone.Синхронизация обоих требует от вас каждого изменения пользовательского интерфейса или рабочего процесса в двух местах.Ура. Обновление : в iOS 8 и Xcode 6 вы можете использовать одну раскадровку для iPhone и iPad.

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

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

  • Раскадровки не доступны для поиска : поиск по всему проекту в XCode не является поиском по всему проекту, когдаВы используете раскадровки.Они не включены в поиск.Поэтому, когда вы удаляете пользовательский класс из своего кода или переименовываете его, вам придется вручную просматривать раскадровку или просматривать его необработанный XML, чтобы убедиться, что он соответствует вашим изменениям кода.Нет, сэр, мне это не нравится. Обновление : раскадровки доступны для поиска в Xcode 6.

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

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

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

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

  • Раскадровки не позволяют включать автоматическое расположение для отдельного представления (-Controller). S : установив / сняв флажок «Автоматическое расположение в раскадровке», изменение применяется ко ВСЕМ контроллерам в раскадровке.(Спасибо Сава Мазаре за этот пункт!)

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

  • Это McDonald's : Сказать это словами Стива Джобса о Microsoft: Это Макдональдс (видео) !

1 голос
/ 16 января 2015

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

1) Очень приятно проектировать интерфейсы

2) Вы можете использовать StoryBoard Segues для прохладного определения навигационных / модальных связей.

3) Если ваше приложение поддерживает несколько устройств, это хороший способ организовать разные представления.

4) Прототипирование - это еще одно дополнительное преимущество.

5) Прототип UITableViewCell может сэкономить время и уменьшить объем кода.

6) вы можете увидеть все экраны приложения в одном месте с помощью StoryBoard.

7) Вы можете легко просмотреть отношения между ними

8) если вы работаете над чьим-то кодом, вы сможете лучше понять суть приложения.

9) Вы можете настроить пользовательский интерфейс для iPhone 4 и iPhone 5, применив форм-фактор сетчатки из раскадровки, без повторного запуска приложения.

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

Недостатки:

1) Доступно только в iOS 5 +

2) StoryBoardSegues довольно жесткие, и вы можете использовать prepareForSegue много раз.

4) Как и IB, не очень дружит с другими механизмами отображения и инструментальными наборами.

4) Трудно обмениваться дизайнами для одного представления или набора представлений - вы должны отправить все или ничего.

5) Для раскадровки вам понадобится большой экран, особенно для iPad.

6) Сложность при копировании представлений из других приложений в раскадровку.

7) Проблемы в раскадровке, когда несколько разработчиков работают над одним проектом с использованием git-репозитория

скопировано с какого-либо ресурса

1 голос
/ 03 февраля 2014

Вы видите большую картинку за одну секунду. Имея много файлов NIB, ну, вы не видите общую картину. Проще поддерживать ваши программы. Проще понять другие программы ... среди других.

...