#ios5 #storyboard
#ios5 #Раскадровка
Вопрос:
В iOS5 с помощью функции раскадровки я хочу создать пользовательский контейнер, в который будет встроено 2 ViewControllers
. Например, встроить контроллер представления таблицы, а также контроллер представления в один ViewController
.
То есть один контроллер представления будет иметь 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, это больше не работает. Возможно, есть способ реализовать нечто подобное, но мы переключили наш проект на стандартные панели вкладок.