2012-01-12 3 views
7

фонИспользование нескольких файлов nib с одним контроллером представления?

Я использую Interface Builder для создания пользовательского интерфейса для приложения, я работаю. Приложение имеет один экран, который отображает ряд кнопок. Нажатие на кнопку отображает соответствующий вид, который накладывает кнопки. Нажатие на другую кнопку скрывает предыдущий вид наложения и отображает другую.

Слишком упростить управление интерфейсом в IB. Я решил создать несколько файлов nib для каждого дополнительного представления, которое должно появиться при нажатии соответствующей кнопки. Затем я загружаю файл nib sub view в режиме viewDidLoad контроллера вида, используя класс UINib.

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

Пример кода, загружающий дополнительный вид из файла nib.

- (void)viewDidLoad 
{ 
    UINib *aSubViewNib = [UINib nibWithNibName:@"aSubView" bundle:nil]; 
    NSArray *bundleObjects = [aSubViewNib instantiateWithOwner:self options:nil]; 

    // get root view from bundle array 
    UIView *aSubView = [bundleObjects objectAtIndex:0]; 
    [self.view addSubview:aSubView]; 
... 

Указанный выше код повторяется для других видов.

Чтобы подвести итог, у меня есть приложение для iPhone с одним экраном, которое имеет многоуровневые виды, которые отображаются/скрыты при нажатии кнопок. Это достигается с помощью одного контроллера представления с ассоциированным файлом nib и рядом дополнительных файлов nib для подзадач, которые загружаются в методе viewDidLoad контроллера вида.

Вопросы!

Извините за подробное введение, но я хотел быть предельно ясным, что я делаю.

  • Является ли мой подход плохим или необычным?
  • Есть ли какие-либо потенциальные проблемы для этого?
  • Что делают другие люди, когда им нужен динамический интерфейс, и все еще хотят сохранить все в интерфейсе Builder?

Примечания

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

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

Заранее спасибо.

ответ

1

Между диспетчерами и представлениями зрения не существует отношения 1 к 1. Большинство просмотров содержат много подзаголовков, которые сами являются представлениями, поэтому это буквально не имеет смысла.

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

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

С другой стороны, у вас могут быть две таблицы, которыми управляет один и тот же viewController, где одна таблица заполнена значимыми данными, а другая - просто владельцем места (например, когда источник данных пуст). Один может быть виден, а другой - нет. Почему вы усложнили жизнь, создав два контроллера вида, когда оба они управляются одним и тем же источником данных (модель)?

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

UPDATE

Кстати, у меня есть пример, который я в настоящее время работает с этим можно проиллюстрировать подобную ситуацию. В InAppSettingsKit, который используется многими разработчиками, есть несколько xib-файлов для фрагментов основного представления. You can look at the structure here on github. Существует один главный контроллер и несколько xib-файлов. (Существует также то, что я бы назвал контроллером вида «помощник» и контроллером представления композитора электронной почты.) В этом примере xib-файлы могут использоваться несколько раз, чтобы указать макет ячеек таблицы. Тем не менее, для каждого xib-файла нет контроллера вида. (Документация для InAppSettingsKit разрежена, поэтому эти вещи могут быть не очевидны, просто взглянув на нее.)

+0

Итак, для моего случая использования, когда единственная причина, по которой я разделял взгляды на отдельные файлы nib, заключалась в том, чтобы упростить управление этими представлениями в IB, считаете ли вы, что мой подход безопасен в использовании или он нарушает рекомендации Apple? – Camsoft

+0

Нет правил или рекомендаций относительно того, что вы делаете. Ты в порядке. – Jim

+0

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

1

Каждый вид должен иметь соответствующий UIViewController. Используя один ViewController для «управления», более одного вида разбивает парадигму MVC. «Контролировать» несколько «просмотров» с одного контроллера будет намного сложнее изменить одну вещь, не нарушая что-то еще.Выбор, который вы делаете о том, как представить контент конечному пользователю, будет отличаться для каждого человека. Поэтому, если вы скажете, что NavigationController не будет работать в вашем случае, возможно, это будет мнение Modal, или вы можете просто создать экземпляр пользовательских UIViewControllers и добавить их в свой вид ([addSubview:]), если это тот путь, который вы хотите, но, как я уже сказал, было бы полезно создать «контроллер» для каждого объекта вида вместе с соответствующим xib. Если вам нужна информация, отправленная обратно, используйте делегат или используйте «Уведомления», чтобы отправить сообщение обратно в родительское представление. Я усвоил трудный путь, который не соответствует парадигме MVC, сделает вас несчастной жизнью. Постарайтесь, чтобы ваш код был как можно более развязан. И прочитайте в шаблоне проектирования MVC, вы не пожалеете об этом.

+0

Все суб виды связаны с одного экрана и, следовательно, один контроллер представления.Я мог бы просто добавить все подвыводы в один и тот же файл nib, но, как я уже сказал, он становится беспорядочным и сложным для макета, поскольку представления перекрываются. Моя идея состояла в том, чтобы разбить некоторые виды на отдельные файлы nib, а затем загрузить их обратно в основное представление с помощью метода viewDidLoad контроллера представления. – Camsoft

+0

Каждый вид должен иметь соответствующий UIViewController. Используя один ViewController для «управления», более одного вида разбивает парадигму MVC. если это правда, как работает универсальный контроллер просмотра ?, он имеет 2 наконечника. – Juan

+0

Я думал почти то же самое @Hubert. Кажется, что с этим связаны некоторые проблемы. Если решение принимается во время выполнения и при нажатии кнопки, не означает ли это, что xib будет загружен в фоновом режиме, проинформировать все из них, и один будет выбран? Кроме того, автозапуск мог решить проблему легко. –

0

Фактически это возможно.

Откройте ваш .xib-файл, выберите «Владелец файла» (в качестве заполнителя) -> «Инспектор удостоверения личности» (утилиты) -> измените имя класса на свой класс контроллера -> нажмите кнопку управления и перетащите владельца файла в поле «Просмотр объекта», view "в диалоговом окне. Теперь вы можете настроить свой вид.

p.s. вы можете использовать те же самые выходы, что и первый xib, вам нужно только перетащить их на новый xib (+ контроль уверен).

здесь это объяснено учебник: http://irawd.wordpress.com/2013/09/05/how-to-link-a-xib-file-to-a-class-and-use-2-xib-files-for-iphone4-and-iphone5/

+0

ссылки в SO могут быть хорошими, но ссылки, как правило, теряются ... Пожалуйста, разместите критические элементы вашего ответа в теле ответа. – NirMH

+0

Редактор @NirMH. спасибо за отзыв, мой мой первый ответ на SO – user3206558

Смежные вопросы