Как создать пользовательский контейнер контроллера вида с помощью раскадровки в iOS 5

#ios5 #storyboard

#ios5 #Раскадровка

Вопрос:

В iOS5 с помощью функции раскадровки я хочу создать пользовательский контейнер, в который будет встроено 2 ViewControllers . Например, встроить контроллер представления таблицы, а также контроллер представления в один ViewController .

То есть один контроллер представления будет иметь 2 отношения:

  1. к контроллеру табличного представления
  2. для просмотра контроллера, который, в свою очередь, будет иметь 4 UIImage вида или UIButton в нем

Возможно ли создание такого типа отношений только с помощью функции перетаскивания раскадровки, а не программно?

Комментарии:

1. У меня возникла проблема с вашим примером. Событие CustomViewController viewDidLoad никогда не запускается… Это нормально? Есть ли способ это исправить? В остальном, это действительно хороший пост! Спасибо.

Ответ №1:

Для управления сценой у вас должен быть только один view controller. Однако этот ViewController может иметь два других контроллера view, которые управляют определенными подвидами в вашей сцене. Для этого вы создаете свойства в своем scene ViewController, в вашем случае одно для вашего TableViewController и одно для вашего представления. Мне нравится объединять вещи, поэтому я создаю оба этих выхода ViewControllers и создаю их в interface builder. Чтобы создать их в interface builder, извлеките объект из библиотеки объектов и задайте его тип в соответствующем ViewController. Подключите его к соответствующему выходу, который вы только что создали в ViewController вашей сцены — Примечание: это важно, иначе ViewController будет выпущен, если вы используете ARC, и произойдет сбой вашего приложения. Затем подключите эти ViewControllers к представлению, которым вы хотите, чтобы они управляли, и готово.

В качестве альтернативы вы можете создать экземпляр ViewControllers и подключить его в вашем scenes ViewController, если вы предпочитаете это делать.

Надеюсь, это поможет.

Редактировать: По размышлении это не очень хорошая идея и фактически противоречит HIG, вы должны поддерживать только один ViewController для каждого экрана содержимого и вместо этого попытаться создать подходящий класс view и заставить единый view controller обрабатывать взаимодействия между различными представлениями.

Комментарии:

1. Мы можем создать выход для views, но как создать выход для ViewController в storyboard?

2. Откройте interface builder и выберите свою раскадровку. В правом нижнем углу вы увидите библиотеку объектов (откуда вы извлекаете контроллеры вида и представления), введите object в поле поиска, и вы увидите маленький желто-оранжевый объект, перетащите его на вашу сцену и измените его тип в инспекторе идентификации на ваш контроллер вида. Затем подключите представление, которое находится в вашей сцене, для управления им, и все. В вашем коде просто создайте IBOutlet для вашего класса контроллера представления и подключите к нему объект.

3. Но как подключить представление к элементу управления? Что я сделал, так это следующее: выберите файл раскадровки-> перетащите viewcontroller (основной контроллер представления), TableViewController (один из контроллеров дополнительного представления) и еще 1 UIViewController (другой контроллер дополнительного представления). Затем в главном контроллере представления я создал 2 IBOutlets для UITableViewController и UIViewController. Затем выберите Основной UIViewController-> щелкните по нему правой кнопкой мыши и подключите созданный IBOutlet к TableViewController в storyBoard. Но это не создало соединение. Пожалуйста, дайте мне знать, если я делаю что-то не так

4. Я собрал пример того, как это сделать, вы можете загрузить исходный код здесь, scott-sherwood.com/?attachment_id=564 надеюсь, это поможет

5. Скотт, о вашей правке: в iOS 5 именно для этой цели было добавлено ограничение UIViewConroller (позволяет использовать несколько контроллеров в одной «сцене»). Мне просто кажется, что документация и примеры легкие, чрезвычайно простые или вообще не существуют. Ваш пример — отличное начало. Есть мысли о том, как поместить UINavigationController вместо UITableView?

Ответ №2:

Есть способ сделать это, который не слишком сложен. Это описано по следующему URL-адресу для UITabBarControllers, который вы могли бы использовать: первый контроллер представления в списке управляет первым подвидом, а второй — другим. Или, вероятно, вы можете адаптировать код для работы с UISplitViewController.

http://bartlettpublishing.com/site/bartpub/blog/3/entry/351

По сути, это работает путем замены tabbarcontroller во время выполнения после завершения его настройки iOS.

Комментарии:

1. К вашему сведению — начиная с iOS 7, это больше не работает. Возможно, есть способ реализовать нечто подобное, но мы переключили наш проект на стандартные панели вкладок.