Использование нескольких файлов пера с одним контроллером представления? - PullRequest
7 голосов
/ 12 января 2012

Фон

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

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

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

Пример кода загрузки вспомогательного представления из перафайл.

- (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, которое имеет многоуровневые представления, которые отображаются / скрываются при нажатии кнопок.Это достигается с помощью одного контроллера представления со связанным файлом пера и серией дополнительных файлов пера для вложенных видов, которые загружаются в метод viewDidLoad контроллера представления.

Вопросы!

Извините за длинное вступление, но я хотел очень четко понять, что я делаю.

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

Примечания

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

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

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

Ответы [ 3 ]

1 голос
/ 12 января 2012

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

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

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

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

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

ОБНОВЛЕНИЕ

Кстати, у меня есть пример, с которым я сейчас работаю, который может проиллюстрировать похожую ситуацию.В InAppSettingsKit, который используют многие разработчики, есть несколько файлов XIB для фрагментов основного представления. Вы можете посмотреть структуру здесь на github .Существует один основной вид контроллеров и несколько файлов XIB.(Существует также то, что я бы назвал «вспомогательным» контроллером представления и контроллером представления составителя электронной почты.) В этом примере XIB-файлы могут использоваться несколько раз для указания расположения ячеек табличного представления.Однако для каждого файла XIB нет контроллера представления.(Документация для InAppSettingsKit немногочисленна, поэтому эти вещи могут быть не очевидны, если просто взглянуть на них.)

0 голосов
/ 18 мая 2014

на самом деле это возможно сделать.

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

ps вы можете использовать те же розетки, что и в первом 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 голосов
/ 12 января 2012

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

...