2011-01-15 4 views
4

Основываясь на документации и образцовом коде, который я прошел, у меня сложилось впечатление, что когда класс, определенный в xcode, считывается и настраивается в Interface Builder, эффективно создается объект, основанный на классе и хранится в файле xib или nib. Таким образом, объект готов к использованию при запуске соответствующего приложения.Инициализация объекта Builder Interface Builder

В качестве альтернативы для классов, которые не обрабатывались интерфейсом Builder, код, такой как «новые» операторы, должен быть явно записан в xcode, чтобы связанные и связанные объекты были созданы и использованы.

Это будет очень приятно иметь людей, которые более, чем меня знающие, чтобы подтвердить или исправить мой очень наивный понимание Interface Builder ...

ответ

6

Ваше понимание правильно, но неполно. Да, Interface Builder создает экземпляры классов и сериализует их в NIB. Однако эти объекты автоматически не доступны для вашего кода.

Для каждого объекта IB, к которому вы хотите получить доступ через Xcode, вам необходимо объявить переменную IBOutlet. Пример:

IBOutlet NSWindow* mainWindow; // A Reference to your main window 

Поместите этот код в файле заголовка пользовательского объекта, который вы создать экземпляр через Interface Builder (перетащить общий объект в список класса, а затем на вкладке Удостоверение инспектора задайте нестандартный объект быть примером вашего класса). Затем щелкните правой кнопкой мыши на свой пользовательский объект в Interface Builder. Вы должны увидеть запись для своего IBOutlet в появившемся окне. Перетащите из маленького круга рядом с ним в (в этом примере) основное окно. Теперь у вас есть ссылка на объект IB в Xcode.

Именно с помощью этих соединений (с IBOutlets для ссылок и IBActions для методов) вы определяете большую часть поведения вашего приложения.

+0

Спасибо за подробное объяснение. Но у меня есть еще один вопрос: есть ли «IBOutlet NSWindow * mainWindow»; Пример заявления, упомянутого выше, должен быть объявлением класса «свойство»? – Stanley

+0

нет, это может быть просто ivar, пока вы добавляете ключевое слово IBOutlet, иначе u не сможет связать его с помощью построителя интерфейса. – Pochi

1

Файлы Nib содержат архивированную копию графа объекта; все NSNib или NSBundle должны знать, чтобы создавать новые экземпляры всех объектов, хранящихся в файле nib, соединенных вместе, как описано привязкой nib, и с их свойствами, установленными на значения, указанные в nib.

Весь процесс описан в The Object Loading Process

объекты не создаются автоматически из кончика пера, а созданный по требованию в ответ на какой-то объект загрузки, что СИБ файл. Разница важна, потому что у вас может быть один объект, загружающий наконечник более одного раза или у нескольких объектов загружается один и тот же файл nib.

Например, я могу создать наконечник, владельцем которого является UIViewController, который связывает один объект UIView с свойством «view» владельца файла. Тогда я мог бы иметь два разных подкласса UIViewController (или два экземпляра одного и того же подкласса UIViewController), загружая тот же самый файл nib, чтобы каждый получил свою собственную копию UIView. Точно так же я могу загружать новый UITableViewCell из наконечника каждый раз, когда мне нужна новая ячейка для таблицы.

+0

Вчера было 3 ответа. Теперь их всего 2. Я думаю, что все 3 ответа дают хорошее решение/предложение в разных аспектах. Но вчера стало поздно, и у меня не было времени полностью опробовать 3-е предложение. Есть ли способ получить третий ответ, который я видел вчера? – Stanley