Какова наилучшая практика при использовании UIStoryboards?

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

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

Итак, мой вопрос в том, какие наилучшие методы использования?

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

Также должен ли я по-прежнему рассматривать место для Xibs? В этой статье есть довольно хороший обзор многих проблем, и он предлагает, что для сцен, которые имеют только один экран, в этом случае следует использовать xib. Опять мне кажется необычным для меня, что поддержка Apple для создания несвязанных сцен из раскадровки предполагает, что у xibs не будет места в будущем, но я могу ошибаться.

Ответ 1

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

В последнее время многие из моих раскадровки содержат четыре или менее сцены. Для одного человека достаточно просто создать и поддерживать один или несколько таких модулей пользовательского интерфейса. Эта практика уменьшает или устраняет конфликты слияния.

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

Что касается XIB, я не думаю, что написал о них в своей статье. Они все еще очень полезны. Они могут быть хороши для контроллеров с одним представлением. Однако это не то место, где они действительно сияют. У XIB есть одно преимущество, которое никогда не может иметь раскадровки. Самой базовой единицей XIB является UIView, тогда как базовым элементом раскадровки является UIViewController. Поскольку XIB могут содержать коллекции UIViews, они отлично подходят для визуального создания настраиваемых элементов управления. В XIB я могу визуально создать поворотный диск или GPS-виджет. Затем я могу удалить эти элементы управления и виджеты в раскадровки или другие XIB. Такие XIB чаще встречаются в iPad-приложениях, поскольку у них более крупные экраны, способные удерживать множество элементов управления и виджетов. Было бы неестественно создавать UISwitch внутри в UIViewController в раскадровке.

Теперь о лучших новостях. Можно подключить раскадровки в Interface Builder и без написания кода. Я планировал выпустить эту технику после WWDC, так как Apple может выпускать аналогичные функции в iOS 6. Однако, поскольку вы спросили, я решил выпустить ее сейчас. Вместо того, чтобы дублировать мои объяснения о том, как работает RBStoryboardLink, вы можете найти более подробную информацию о моих blog и GitHub. Это сделает ваш UIStoryboard более приятным.

Ответ 2

Я обнаружил, что статья упоминала много проблем при использовании StoryBoard, одна вещь, которую автор поставил, использует огромное количество файлов nib в одном StoryBoard, который я согласился, что он не должен этого делать, но были и другие проблемы, такие как:

Мой контроллер корневого представления стал контроллером представления исходного кода для segues и, следовательно, его подготовкаForSegue: стала тупой большой метод, заполненный множеством "if (segue.identifier isEqualToString: @"... ")" операторы в строке

и

Можно назначить контроллеры представлений в раскадровке идентификатор. К сожалению, это свойство идентификатора не отображается в класс UIViewController. Это затрудняет выполнение интроспекция иерархии диспетчера представлений во время выполнения. Это было бы очень приятно, если идентификатор был выставлен для контроллеров представлений, а также для segues.

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