2009-10-21 3 views
1

Поскольку я двигаюсь все больше и больше своего дизайна пользовательского интерфейса от XCode до IB, есть еще одно препятствие, которое мне нужно очистить.Интерфейс Builder. Как заменить программные ViewControllers на IB ViewControllers?

В настоящее время я создаю свой пользовательский viewControllers в XCode с пользовательскими инициализаторами. Обычно они имеют кучу ivars, которые устанавливаются во время инициализации через переданные параметры. Я бы очень хотел переместить столько, сколько я могу, чтобы IB.

Может ли кто-нибудь тщательно объяснить мне - или, лучше, указать мне на код - как реплицировать подход XCode прохождения параметров с помощью пользовательского инициализатора в IB - предположительно через IBOutlet.

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

Приветствия, Doug

UPDATE:

Типичный scenerio мой AppDelegate будет выходить в сеть, захватить некоторые данные - NSMutableData, а затем передать ссылку на корневой ViewController - обычно TableViewController - который нажимается на стек viewController навигационного контроллера.

Когда ячейка выбрана, secondViewController является alloc/init'ed, и под ним передается подмножество данных. SecondViewController отправляется в сеть для получения большего количества данных, строит иерархию представлений, обрабатывает биты полученных данных в каждом подвью, а затем каждый подпункт передается с помощью setNeedsDisplay для обработки данных.

Возможно, это передача иерархических данных, которые я хочу передать в IB.

+0

Являются ли ivars все подклассы 'NSControl'? Или это другие биты данных, которые поступают из другого места в вашем приложении? –

+0

Насколько я знаю, то, что вы описали в своем обновлении, невозможно в IB. –

+0

Я имею дело с Primaryy с NSMutableData, NSMutableString и NSMutableArray. Контейнеры и строки, которые не являются подклассами NSControl. Должен ли я сделать вывод из вашего комментария, что подклассы non-NSControl не могут быть IBOutlets? – dugla

ответ

3

У вас все еще может быть пользовательский инициализатор. Однако внутри этой инициализации вы вызовете -[initWithNibName:@"yourNibName" bundle:bundle]. Вы соедините свои переменные экземпляра UIKit (UILabel, UIButton и т. Д.) В построителе интерфейса и, следовательно, не нужно будет создавать эти объекты в своем инициализаторе. Другие переменные экземпляра (строки, словари, пользовательские объекты и т. Д.) Вы создадите и установите в своем инициализаторе.

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

Дайте мне знать, если вам нужна дополнительная информация.

+0

Спасибо Justing. Да, это почти тот подход, который я использовал. Я надеялся, что есть способ рефакторинга, который я делаю с не-UIKit ivars - NSMutableData, NSMutableArray и т. Д. - в viewDidLoad для IB. Похоже, это невозможно. – dugla

+0

Нет проблем. Чтобы быть ясным, вы можете захотеть выполнить инициализацию этих vars в своем пользовательском инициализаторе вместо viewDidLoad. –

+0

Justing, На самом деле, что я обычно делаю, это ждать, пока viewDidAppear :. То, что я делаю, показывает spinner, в то время как я асинхронно получаю данные из сети, немного накатываю данные, отсылаю приготовленные данные к моим подзонам, вызываю setNeedsDisplay в своих подзонах и выключаю счетчик. – dugla

2

Допустим, у нас есть MyViewController, который расширяет UIViewController и MyViewControllerParameter, который является одним из наших пользовательских объектов, которые мы передаем в MyViewController при инициализации. MyViewController имеет IBOutlets типа MyViewControllerParameter, определенный в нем. Мы хотим поместить MyViewController в другой содержащий вид ParentView.xib. ParentView.xib принадлежит ParentViewController.m и создан в другом месте. Мы дважды щелкаем ParentView.xib в XCode, чтобы запустить Interface Builder. Затем мы перетаскиваем «объект» из представления библиотеки (я считаю, что вы открываете представление библиотеки с помощью Cmd + Shift + L, если оно не открыто по умолчанию) в окне «Документ». (Это окно активировано Cmd + 0.)

«Объект» - это произвольный виджет, найденный в библиотеке (обозначенный символом сплошного золотого куба), который может представлять что-либо в вашем проекте. После того, как мы поместили новый объект в окно документа, мы набираем Cmd + 4, чтобы открыть окно Indentity Inspector. В верхнем текстовом поле мы можем ввести имя нашего параметра контроллера просмотра «MyViewControllerParameter». Затем мы увидим виджет ViewController в библиотеке и переместим его в окно документа.Мы открываем инспектор атрибутов (Cmd + 1) и устанавливаем имя элемента «MyView.xib». Это должно привести к тому, что CocoaTouch загрузит MyViewController, используя определения в «MyView.xib».

Откройте идентификатор инспектора и установите атрибут класса в MyViewController. Наконец, мы нажимаем правой кнопкой мыши или управляем щелчком (или двумя пальцами, если мы правильно настроили трекпад на нашем MacbookPro) MyViewController в окне документа. Это откроет окно, показывающее все IBOutlets в MyViewController. Перетащите строку из маленького открытого круга рядом с выходом MyViewControllerParameter и опустите его на объект MyViewControllerParameter, расположенный в окне документа. Подключение этих точек - это то, как вы устанавливаете параметры между объектами с помощью конструктора интерфейса.

+1

Небольшое форматирование (например, разрыв строки или два) может сделать ваш ответ * много * более легким для чтения. –

+0

Спасибо Клифф. Однако, как я начинаю понимать, IBOutlets можно использовать только с подклассами NSControl. Я имею дело с Primaryy с NSMutableData, NSMutableString и NSMutableArray. Контейнеры и струны. Это не подклассы NSControl. – dugla

+0

Это новости для меня. Я думал, вы можете подключить любой объект к IBOutlet, если он доступен в файле xib. Однако я могу ошибаться. – Cliff

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