Как создать отношение контейнера/дочернего контроллера представления в построителе интерфейса

Чтобы создать из кода родительские/дочерние отношения между двумя контроллерами представления, в основном это просто вопрос выполнения чего-то вроде:

[self addChildViewController:childViewController];
[self.view addSubview:childViewController.view];

где self — родительский контроллер представления.
Но, что, если я хочу полностью создать такое же отношение из Interface Builder?
Или, другими словами: есть ли способ воссоздать поведение метода addChildViewController с помощью Interface Builder?
Я не нашел много документации по этому поводу, вот старый неразрешенный пост на эту тему: https://devforums.apple.com/message/455758#455758

Без правильной настройки отношения addChildViewController ни один из методов поворота не перенаправляется на мой дочерний контроллер представления, отсюда и мой вопрос.

Вот что я сделал в IB:

  1. перетащите объект «Контроллер представления» из панели «Библиотека объектов» на панель «Объекты»
  2. в инспекторе удостоверений я изменил его класс на свой подкласс UIViewController ("Контроллер представления элементов")
  3. подключил вьюшку к контроллеру
  4. подключил все остальные необходимые розетки к контроллеру (имя списка, табличное представление)

Первый объект «Вид» на картинке — это вид моего родительского контроллера представления, вместо этого выделенный «Вид» — это вид дочернего контроллера представления («Контроллер представления элементов»).

введите здесь описание изображения

Контроллер контейнера также сохраняет свой дочерний экземпляр через дополнительный IBOutlet:

@property (nonatomic, strong) IBOutlet ItemsViewController *itemsViewController;

Спасибо


Обновление 1: если я вручную устанавливаю отношение родитель/потомок в viewDidLoad контроллера контейнера, все методы поворота правильно перенаправляются дочернему элементу.

[self addChildViewController:self.itemsViewController];

Но я действительно не уверен, что это правильный способ сделать это, так как я хотел бы сделать все, используя IB.


Обновление 2: благодаря @micantox за его подсказку использовать «Контейнерное представление» в библиотеке объектов, я преобразовал свой xib-файл в раскадровку, и теперь дочерний контроллер представления добавлен к его родительскому, поэтому мне не нужно добавлять его вручную из кода с помощью addChildViewController, а методы поворота перенаправляются, как и ожидалось.
«Представление контейнера» в основном реализует встраивание перехода и поддерживается только в iOS 6.
Это обновленный снимок экрана из моей раскадровки:

введите здесь описание изображения




Ответы (3)


Правильный способ создания контейнерных представлений для дочерних контроллеров представлений — использование объекта «Контейнерное представление» в библиотеке объектов. Перетаскивание одного из них в сцену вашего контроллера представления создаст новую сцену для дочернего контроллера представления, которой можно управлять отдельно от родительского контроллера представления.

person micantox    schedule 13.05.2013
comment
Из того, что я знаю, контроллер представления Container не ограничивается только iPad, но также доступен на iPhone ="nofollow noreferrer">ссылка, я использовал ее более чем в одном приложении. В этом случае я хочу сделать это на iPad. - person ggould75; 13.05.2013
comment
В любом случае, сделать это в построителе интерфейса можно через объект Container View в Object Library! Это позволит вам отдельно управлять представлением вашего дочернего контроллера представления. - person micantox; 13.05.2013
comment
Спасибо, я не знал о существовании этого объекта, на самом деле я работаю с одним xib-файлом, а не с раскадровкой, и, похоже, он доступен только на раскадровке. Я собираюсь попробовать... - person ggould75; 13.05.2013
comment
Объект Storyboard + Container View решил мою проблему! Я обновил исходный ответ. - person ggould75; 14.05.2013

Кроме того, если вы пытаетесь создать переход к существующему контроллеру представления в раскадровке, перетащите элемент управления из представления контейнера, а не из VC контейнера, в VC, который вы хотите внедрить.

person Joe Regan    schedule 05.12.2013

Очень простой способ сделать это — просто создать экземпляр дочернего контроллера представления, сославшись на его идентификатор раскадровки:

UITableViewController *childViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"childViewController"];

[self addChildViewController:childViewController];
[self.view addSubview:childViewController.view];

Таким образом, вы можете создать оба контроллера представления в построителе интерфейса. Вы можете установить идентификатор раскадровки в конструкторе интерфейса: выберите контроллер представления, и вы увидите поле для него в инспекторе идентификации.

person inorganik    schedule 28.04.2015