Я новичок в iOS и задаюсь вопросом, что лучше всего изучать. Я прочитал некоторые из ответов здесь и SO, но некоторые люди говорят, что использование Storiesboards будет говорить, что сначала узнают XIB. Есть ли реальная польза для обучения XIB? Легче ли понять XIBs и помогут ли раскадровки?
Раскадровка против старого метода XIB
Ответ 1
Есть вещи, которые вы можете сделать с раскадрой, которую вы не можете сделать с помощью наконечника. Раскадровка позволяет создавать сегменты между контроллерами представлений и позволяет вам создавать ячейки табличного представления на месте.
Есть вещи, которые вы можете сделать с наконечником, который вы не можете сделать с раскадрой. В наконечнике вы можете создавать ссылки на место владельца файла. Вы можете создавать несколько видов верхнего уровня, редактировать их и создавать соединения между ними. См. этот ответ для примера, почему вы хотите это сделать. Вы можете добавить внешние заполнитель объектов (редко используемая функция).
У раскадровки есть недостаток, что они собирают кучу разных, слабо связанных объектов в один большой файл. Если вы работаете над проектом с несколькими разработчиками, вы, скорее всего, столкнетесь с конфликтами слияния, если используете раскадровку, чем если вы используете xib файлы.
В какой-то момент вам обязательно нужно узнать о nib. Если вы хотите начать с них или начать с раскадровки, вероятно, не слишком важно. Просто найдите некоторые обучающие программы, которые вам нравятся, и проработайте их с любым типом файла (nib или раскадровки), который они используют.
Ответ 2
Существует полезность изучения обоих подходов.
Помимо исторической ценности подхода xib, xib также обеспечивает модульность. Возможно, у вас есть библиотека кода или вы хотите поделиться полезным виджетами, которые вы сделали. Использование подхода xib облегчит совместное использование и повторное использование.
Подход xib также дает вам большую гибкость с точки зрения вашего собственного кода. Например, в iOS 5 была ошибка с поддержкой UITableView
и Accessibility/VoiceOver, которая привела бы к возврату -dequeueReusableCellWithIdentifier:
nil
, несмотря на то, что была зарегистрирована в противном случае (см. это сообщение в блоге для получения дополнительной информации). Для динамической загрузки табличных ячеек из xib обеспечивается возможность работы с ошибкой.
В то время как поддержка таблиц и табличных сокетов в Storyboards замечательна и обеспечивает поддержку того, что большинство людей нужно делать в таблице, иногда вам приходится окрашивать вне строк, вам может понадобиться много разных ячеек, а также динамическая загрузка из xibs может быть вашим решением.
Одним из больших преимуществ раскадровки является возможность просмотра всего потока графического интерфейса приложения. Уменьшите масштаб, и вы увидите, как все соединяется и течет. С xibs, в то время как модульность хороша, более жестко предвидеть, как все соединяется и течет вместе. Это может быть полезной функцией для вас, или если у вас есть большая команда, с которой вы хотите поделиться, чтобы другие могли видеть, как приложение течет.
Значение в обоих подходах, и хорошо знать оба, чтобы вы могли выбрать лучший инструмент для своей задачи.
Обновление 2014-10-06. Поскольку я написал выше, я был вовлечен в большее количество проектов. Некоторые с xib, некоторые из которых могут использовать раскадровки.
Раскадровки повзрослели очень много (сейчас мы на Xcode 6), и там очень много хороших. Мне очень нравится, как намного больше можно сделать в раскадровке, которая немного сложнее в xib-подходе. Несколько примеров:
Во время работы с UITableView
или UICollectionView
вы можете работать с ячейками прототипов непосредственно в раскадровке. Много приятной и простой настройки, большая часть тяжелого подъема может быть в раскадровке, меньше кода. Это довольно хорошо. Попытка сделать это в подходе xib, безусловно, не под силу, но есть намного больше работы, чтобы это произошло.
Другим является то, насколько приятно вы можете перейти между UIViewController
с регулярными переходами, а затем вернуться с развязкой. Все прямо там, в раскадровке, с минимальным кодом. Это просто удобно.
Но одна вещь, которая до сих пор убивает раскадровки для меня, пытается использовать их в совместной среде. Это просто не собирается хорошо сливаться. И в некоторых отношениях это даже если вы работаете в команде из > 1 человека. Если вы сами воспользуетесь контролем версий, используйте хорошую ветвящуюся и объединяющую модель для своего личного рабочего процесса, возможно, наступит время, когда некоторые изменения должны будут быть сделаны в какой-либо отрасли, которая должна быть перенесена в другую ветку, и о боль. Для меня это то, что убивает раскадровки.
По мере того, как время и работа развивались, то, что я нахожу для себя, - это раскадровки, которые отлично подходят для прототипирования. Способность быстро находить вещи - огромное преимущество раскадровки. Там много скорости в использовании. Но скорость стоит дорого. Когда дело доходит до написания "реального" кода для какого-либо проекта, я просто буду придерживаться xib, потому что, хотя это может быть больше, это более гибкий маршрут, который просто работает лучше в более крупных командах или с течением времени.
Обновление 2015-04-07 Другое обновление, потому что проекты прошлых месяцев заставили меня использовать раскадровки, которые предоставили больше информации.
Во-первых, некоторые вещи будут определять тот или иной подход. Например, по-видимому, при работе с классами размера в xibs, которые не существовали, делали одно и то же в раскадровке, были ошибки в краевых случаях. Так что, если вас задевают ошибки, это может заставить вашу руку так или иначе. Другой - помнить, что раскадровки обычно работают на уровне UIViewController
, поэтому, если вам нужно сделать что-то вроде загрузки UIView
или UICollectionViewCell
, вероятно, лучше будет обслуживать xib.
Во-вторых, и я не знаю, почему это не произошло со мной сначала, но нет ничего, что требовало бы, чтобы вы использовали уникальную раскадровку для всего своего проекта! Я думаю, что характер раскадровки позволяет людям так тянуться, но мы должны помнить, что ничего не обязано (что я знаю).
То, что я нашел, работает хорошо, - это, как правило, подход к каждой "группировке представлений" для раскадровки. То есть, часто ваши ViewControllers имеют тенденцию быть изолированными и заканчиваются как 1 для раскадровки (или xib). Но у вас может быть ситуация, когда у вас есть два тесно связанных ViewControllers, и имеет смысл помещать их в одну и ту же раскадровку, особенно потому, что тогда вы можете легко подключать их между ними, например segues.
Главное преимущество нескольких раскадровки? Работа в командах. Таким образом, Фред может работать на своем раскадровке, а Вильма может работать над ее раскадрой, и нет сильных забот о проблемах слияния или координации работы! Использование нескольких раскадровки (и, как правило, 1 ViewController для раскадровки) оказало огромную помощь в использовании раскадровки на многопользовательской команде разработчиков.
Это довольно очевидно, Apple хочет, чтобы мы предпочли раскадровки, и я обнимаю их больше в эти дни. Использование нескольких раскадровки, но при использовании xib при необходимости работает достаточно хорошо.
Обновление 2015-09-21 Теперь, когда Apple выпустила Xcode 7, есть еще больше оснований для принятия раскадровки, поскольку Apple работает над устранением недостатков.
Самое важное улучшение - это ссылки на раскадровку, которые позволяют вам создать в одной раскадровке ссылку на другую раскадровку. Это мертво просто сделать, и теперь у вас могут быть кросс-раскадровки (как вход, так и выход). Я использовал это несколько раз уже в новом проекте, и это просто радость.
Еще одно улучшение заключается в том, что вы можете создавать автономные классы UIView
в раскадровке. Однако на момент написания этой статьи у меня были смешанные результаты. Простые случаи работают нормально, но некоторых более "сложных" вещей не было. Например, у меня был UIViewController
с UITableView
внутри него. Поскольку это была простая таблица с 5 статическими ячейками, я просто создал экземпляр 5 UITableViewCell
как часть ViewController в раскадровке. Казалось, что он работает, но затем во время выполнения ничего на самом деле не загрузится и не появится; переместил UITableViewCell
в xib, и все сработало. Я не уверен, что я делаю что-то неправильно или что это может быть, поэтому YMMV. Но все же, даже если есть только некоторые причуды, со временем я уверен, что Apple решит их, а затем еще один барьер против раскадровки упадет. Я бы сказал, что если вам нужна такая поддержка, вы должны попробовать ее и посмотреть, как она идет для вас. Есть большие перспективы.
Все больше и больше, раскадровки формируются, чтобы быть превосходными.