Файлы пера
Файлы пера играют важную роль в создании приложений в OS X и iOS. С файлами пера Вы создаете и управляете своими пользовательскими интерфейсами графически, с помощью XCode, вместо программно. Поскольку Вы видите результаты своих изменений немедленно, можно экспериментировать с различными разметками и конфигурациями очень быстро. Можно также изменить много аспектов пользовательского интерфейса позже, не переписывая кода.
Для приложений созданное использование AppKit или платформ UIKit, файлы пера берут дополнительное значение. Обе из этих платформ поддерживают использование файлов пера и для разметки окон, представлений, и для средств управления и для интеграции тех элементов с кодом обработки событий приложения. XCode работает в сочетании с этими платформами, чтобы помочь Вам соединить средства управления своего пользовательского интерфейса к объектам в Вашем проекте, реагирующим на те средства управления. Эта интеграция значительно сокращает сумму установки, требующейся после того, как файл пера загружается и также упрощает изменять отношения между Вашим кодом и пользовательским интерфейсом позже.
Анатомия файла пера
Файл пера описывает визуальные элементы пользовательского интерфейса Вашего приложения, включая окна, представления, средства управления и многих других. Это может также описать невидимые элементы, такие как объекты в Вашем приложении, управляющие Вашими окнами и представлениями. Самое главное файл пера описывает эти объекты точно, поскольку они были сконфигурированы в XCode. Во время выполнения эти описания используются для воссоздания объектов и их конфигурации в приложении. При загрузке файла пера во время выполнения Вы получаете точную копию объектов, которые были в Вашем документе XCode. Загружающий перо код инстанцирует объектов, конфигурирует их и восстанавливает любые межсоединения объектов, которые Вы создали в своем файле пера.
Следующие разделы описывают, как файлы пера, используемые с AppKit и платформами UIKit, организованы, типы объектов, найденных в них, и как Вы используете те объекты эффективно.
О Ваших интерфейсных объектах
Интерфейсные объекты - то, что Вы добавляете к файлу пера для реализации пользовательского интерфейса. Когда перо загружается во время выполнения, интерфейсные объекты являются объектами, которые фактически инстанцирует загружающий перо код. Самые новые файлы пера имеют по крайней мере один интерфейсный объект по умолчанию, обычно окно или ресурс меню, и Вы добавляете, что больше интерфейса возражает против файла пера как часть Вашего дизайна интерфейса. Это - наиболее распространенный тип объекта в файле пера и обычно, почему Вы создаете файлы пера во-первых.
Помимо представления визуальных объектов, таких как окна, представления, средства управления и меню, интерфейсные объекты могут также представлять невидимые объекты. В почти всех случаях невидимые объекты, которые Вы добавляете к файлу пера, являются дополнительными объектами контроллера что Ваше использование приложения для управления визуальными объектами. Несмотря на то, что Вы могли создать эти объекты в своем приложении, часто более удобно добавить их к файлу пера и сконфигурировать их там. XCode обеспечивает родовой объект, который Вы используете в частности при добавлении контроллеров и других невидимых объектов к файлу пера. Это также обеспечивает объекты контроллера, обычно использующиеся для управления привязкой Какао.
О владельце файла
Один из самых важных объектов в файле пера является объектом Владельца Файла. В отличие от интерфейсных объектов, объект Владельца Файла является объектом местозаполнителя, не создающимся, когда загружается файл пера. Вместо этого Вы создаете этот объект в своем коде и передаете его загружающему перо коду. Причина этот объект так важен, состоит в том, что это - основная ссылка между Вашим кодом приложения и содержанием файла пера. Более в частности это - объект контроллера, который ответственен за содержание файла пера.
В XCode можно создать соединения между Владельцем Файла и другими интерфейсными объектами в файле пера. При загрузке файла пера загружающий перо код воссоздает эти соединения с помощью заменяющего объекта, который что Вы указываете. Это позволяет Вашему объекту сослаться на объекты в файле пера и получить сообщения от объектов интерфейса автоматически.
О первом респонденте
В файле пера Первый Респондент является объектом местозаполнителя, представляющим первый объект в динамично решительной цепочке респондента Вашего приложения. Поскольку цепочка респондента приложения не может быть определена во время проектирования, Первые действия заполнителя Респондента как цель заместителя ни для каких сообщений действия, которые должны быть направлены на цепочку респондента приложения. Пункты меню обычно предназначаются для Первого заполнителя Респондента. Например, пункт меню Minimize в Меню окна скрывает frontmost окно в приложении, не только определенное окно, и пункт меню Copy должен скопировать текущий выбор, не только выбор единственного управления или представления. Другие объекты в Вашем приложении могут предназначаться для Первого Респондента также.
При загрузке файла пера в память нет ничего, что необходимо сделать, чтобы управлять или заменить Первый объект местозаполнителя Респондента. AppKit и платформы UIKit автоматически набор и поддерживают первого респондента на основе текущей конфигурации приложения.
Для получения дополнительной информации о цепочке респондента и как это используется для диспетчеризации событий в находящихся в AppKit приложениях, посмотрите Архитектуру События inCocoa Руководство по Обработке событий. Для получения информации о цепочках респондента и действиях обработки в приложениях для iPhone, посмотрите Руководство по Обработке событий для iOS.
Об объектах верхнего уровня
Когда Ваши загрузки программы файл пера, Какао воссоздает весь график объектов, Вы создали в XCode. Этот граф объектов включает все окна, представления, средства управления, ячейки, меню и пользовательские объекты, найденные в файле пера. Объекты верхнего уровня являются подмножеством этих объектов, не имеющих родительского объекта. Объекты верхнего уровня обычно включают только окна, строки меню, и пользовательский контроллер возражает, что Вы добавляете к файлу пера. (Объекты, такие как Владелец Файла, Первый Респондент и Приложение являются объектами местозаполнителя и не рассмотренные объектами верхнего уровня.)
Как правило, Вы используете выходы в объекте Владельца Файла сохранить ссылки на объекты верхнего уровня файла пера. Если Вы не используете выходы, однако, можно получить объекты верхнего уровня от загружающих перо подпрограмм непосредственно. Необходимо всегда сохранять указатель на эти объекты где-нибудь, потому что приложение ответственно за выпуск их, когда это сделано с помощью них. Для получения дополнительной информации о поведении объекта пера во время загрузки, посмотрите Управление Временами жизни Объектов от Файлов Пера.
Об изображении и звуковых ресурсах
В XCode можно обратиться к внешнему изображению и звучать как ресурсы из содержания файлов пера. Некоторые средства управления и представления в состоянии к изображениям на дисплее или звукам игры как часть их конфигурации по умолчанию. Библиотека Xcode обеспечивает доступ к изображению и звуковым ресурсам Ваших проектов XCode так, чтобы можно было соединить файлы пера с этими ресурсами. Файл пера не хранит эти ресурсы непосредственно. Вместо этого это хранит имя файла ресурсов так, чтобы загружающий перо код мог найти его позже.
Когда Вы загружаете файл пера, содержащий ссылки на изображение или звуковые ресурсы, загружающий перо код читает действительный образ или звуковой файл в память и и кэширует его. В OS X изображение и звуковые ресурсы сохранены в именованных кэшах так, чтобы можно было получить доступ к ним позже в случае необходимости. В iOS только отобразите ресурсы, сохранены в именованных кэшах. К изображениям доступа Вы используете imageNamed:
метод NSImage
или UIImage
, В зависимости от Вашей платформы. Для доступа к кэшируемым звукам в OS X используйте soundNamed:
метод NSSound
.
Руководство по проектированию файла пера
При создании файлов пера важно думать тщательно о том, как Вы намереваетесь использовать объекты в том файле. Очень простое приложение могло бы быть в состоянии сохранить все свои компоненты пользовательского интерфейса в единственном файле пера, но для большинства приложений, лучше распределить компоненты через многократные файлы пера. Создание меньших файлов пера позволяет Вам загрузить только те части своего интерфейса, в котором Вы сразу нуждаетесь. Они также упрощают отлаживать любые проблемы, с которыми Вы могли бы встретиться, так как существует меньше мест для поиска проблем.
При создании файлов пера попытайтесь помнить следующие инструкции:
Разработайте свои файлы пера с ленивой загрузкой в памяти. План по загружающимся файлам пера, содержащим только те объекты, в которых Вы нуждаетесь сразу же.
В основном файле пера для приложения OS X считайте хранение только панелью меню приложения и дополнительным делегатом приложения объект в файле пера. Избегите включая любые окна или элементы пользовательского интерфейса, которые не будут использоваться, пока приложение не запустилось. Вместо этого поместите те ресурсы в отдельные файлы пера и загрузите их по мере необходимости после запуска.
Сохраните повторенные компоненты пользовательского интерфейса (такие как окна документа) в отдельных файлах пера.
Для окна или меню, использующегося только иногда, сохраните его в отдельном файле пера. Путем хранения его в отдельном файле пера Вы загружаете ресурс в память, только если это фактически используется.
Сделайте Владельца Файла единственной точкой контакта для чего-либо за пределами файла пера; посмотрите Доступ к Содержанию Файла Пера.
Жизненный цикл объекта пера
Когда файл пера загружается в память, загружающий перо код предпринимает несколько шагов, чтобы гарантировать, что объекты в файле пера создаются и инициализируются должным образом. Понимание этих шагов может помочь Вам записать лучший код контроллера для управления пользовательскими интерфейсами.
Объектный процесс загрузки
Когда Вы используете методы NSNib
или NSBundle
чтобы загрузить и инстанцировать объектов в файле пера, базовый загружающий перо код делает следующее:
Это загружает содержание файла пера и любых файлов ресурсов, на которые ссылаются, в память:
Необработанные данные для всего графа объектов пера загружаются в память, но не разархивированы.
Любые ресурсы пользовательского изображения, связанные с файлом пера, загружаются и добавляются к кэшу изображений Какао; займитесь Изображением и Звуковыми Ресурсами.
Любые пользовательские звуковые ресурсы, связанные с файлом пера, загружаются и добавляются к кэшу звука Какао; займитесь Изображением и Звуковыми Ресурсами.
Это разархивировало данные графа объектов пера и инстанцирует объектов. То, как это инициализирует каждый новый объект, зависит от типа объекта и как это было закодировано в архиве. Загружающий перо код использует соблюдающие правила (в порядке) для определения который метод инициализации использовать.
По умолчанию объекты получают
initWithCoder:
сообщение.В OS X список стандартных объектов включает представления, ячейки, меню и контроллеры представления, которые предоставлены системой и доступные в библиотеке Xcode по умолчанию. Это также включает любые сторонние объекты, добавленные к библиотеке с помощью пользовательского плагина. Когда объект разархивирован, даже при изменении класса такого объекта XCode кодирует стандартный объект в файл пера и затем говорит archiver загружать пользовательский класс.
В iOS, любой объект, соответствующий
NSCoding
протокол инициализируется с помощьюinitWithCoder:
метод. Это включает все подклассыUIView
иUIViewController
являются ли они частью библиотеки Xcode по умолчанию или пользовательских классов, Вы определяете.Пользовательские представления в OS X получают
initWithFrame:
сообщение.Пользовательские представления являются подклассами
NSView
для которого XCode не имеет доступной реализации. Как правило, это представления, что Вы определяете в своем приложении и использовании для обеспечения пользовательского визуального содержания. Пользовательские представления не включают стандартные системные представления (какNSSlider
) это - часть библиотеки по умолчанию или часть интегрированного стороннего плагина.Когда это встречается с пользовательским представлением, XCode кодирует специальное предложение
NSCustomView
возразите в свой файл пера. Пользовательский объект представления включает информацию, это должно создать реальное представление, разделяют Вас на подклассы указанный. Во время загрузки,NSCustomView
объект отправляетalloc
иinitWithFrame:
обменивайтесь сообщениями к реальному классу представления и затем загружайте получающийся объект представления для себя. Результирующий эффект состоит в том, что реальный объект представления обрабатывает последующие взаимодействия во время процесса загрузки пера.Пользовательские представления в iOS не используют
initWithFrame:
метод для инициализации.Пользовательские объекты кроме описанных на предыдущих шагах получают
init
сообщение.
Это восстанавливает все соединения (действия, выходы и привязка) между объектами в файле пера. Это включает соединения с Владельцем Файла и другими объектами местозаполнителя. Подход для установления соединений отличается в зависимости от платформы:
Соединения розетки
В OS X загружающий перо код пытается повторно соединить выходы с помощью собственных методов объекта сначала. Для каждого выхода Какао ищет метод формы
set
OutletName:
и вызовы это, если присутствует такой метод. Если это не может найти такой метод, Какао ищет объект переменную экземпляра с соответствующим именем выхода и попытками установить значение непосредственно. Если переменная экземпляра не может быть найдена, никакое соединение не создается.Установка выхода также генерирует уведомление наблюдения значения ключа (KVO) для любых зарегистрированных наблюдателей. Эти уведомления могут произойти, прежде чем все межсоединения объектов восстановлены и определенно происходят перед любым
awakeFromNib
методы объектов вызвали.В iOS загружающий перо код использует
setValue:forKey:
метод, чтобы повторно соединить каждый выход. Тот метод так же ищет надлежащий метод доступа и возвращается к другим средним значениям, когда это перестало работать. Для получения дополнительной информации, о как этот метод значения наборов, см. его описание в Ссылке на протокол NSKeyValueCoding.Установка выхода в iOS также генерирует уведомление KVO для любых зарегистрированных наблюдателей. Эти уведомления могут произойти, прежде чем все межсоединения объектов восстановлены и определенно происходят перед любым
awakeFromNib
методы объектов вызвали.
Соединения действия
В OS X загружающий перо код использует исходный объект
setTarget:
иsetAction:
методы для установления соединения с целевым объектом. Если целевой объект не реагирует на метод действия, никакое соединение не создается. Если целевой объектnil
, действие обрабатывается цепочкой респондента.В iOS загружающий перо код использует
addTarget:action:forControlEvents:
методUIControl
объект сконфигурировать действие. Если цельnil
, действие обрабатывается цепочкой респондента.
Привязка
В OS X Какао использует
bind:toObject:withKeyPath:options:
метод исходного объекта для создания соединения между ним и его целевым объектом.Привязка не поддерживается в iOS.
Это отправляет
awakeFromNib
обменивайтесь сообщениями к надлежащим объектам в файле пера, определяющим соответствующий селектор:В OS X это сообщение отправляется в любые интерфейсные объекты, определяющие метод. Это также отправляется Владельцу Файла и любым объектам местозаполнителя, определяющим его также.
В iOS это сообщение отправляется только в интерфейсные объекты, которые инстанцировал загружающий перо код. Это не отправляется Владельцу Файла, Первому Респонденту или любым другим объектам местозаполнителя.
Это выводит на экран любые окна, чьи “Видимый в атрибуте” времени запуска был включен в файле пера.
Порядок, в котором загружающий перо код вызывает awakeFromNib
методы объектов не гарантируются. В OS X Какао пытается вызвать awakeFromNib
метод Владельца Файла длится, но не гарантирует того поведения. Если необходимо сконфигурировать объекты в файле пера далее во время загрузки, наиболее подходящее время, чтобы сделать так после загружающих перо возвратов вызова. В той точке, все объекты создаются, инициализируются и готовые к употреблению.
Управление временами жизни объектов от файлов пера
Каждый раз Вы спрашиваете NSBundle
или NSNib
класс для загрузки файла пера базовый код создает новую копию объектов в том файле и возвращает их Вам. (Загружающий перо код не перерабатывает объекты файла пера от предыдущей попытки загрузки.) Необходимо гарантировать, чтобы Вы поддерживали новый граф объектов настолько же долго по мере необходимости и отрицали его, когда Вы закончены с ним. Вам обычно нужны сильные ссылки к объектам верхнего уровня, чтобы гарантировать, что они не освобождены; Вам не нужны сильные ссылки к объектам, опускаются в графике, потому что они принадлежат их родителям, и необходимо минимизировать риск создания циклов сильной ссылки.
С практической точки зрения, в iOS и выходах OS X должен быть определен как объявленный свойствами. Выходы должны обычно быть weak
, за исключением тех от Владельца Файла к объектам верхнего уровня в файле пера (или, в iOS, сцене раскадровки), который должен быть strong
. Выходы, которые Вы создаете, должны поэтому обычно быть weak
, потому что:
Выходы, которые Вы создаете к подпредставлениям представления контроллера представления или окна контроллера окна, например, являются произвольными ссылками между объектами, не подразумевающими владение.
Сильные выходы часто указываются классами платформы (например,
UIViewController
view
выход, илиNSWindowController
window
выход).
@property (weak) IBOutlet MyView *viewContainerSubview; |
@property (strong) IBOutlet MyOtherClass *topLevelObject; |
Выходы обычно считают частными к классу определения; если нет причина представить свойство публично, скрыть объявления свойства расширение класса. Например:
// MyClass.h |
@interface MyClass : MySuperclass |
@end |
// MyClass.m |
@interface MyClass () |
@property (weak) IBOutlet MyView *viewContainerSubview; |
@property (strong) IBOutlet MyOtherClass *topLevelObject; |
@end |
Эти образцы расширяются на ссылки от контейнерного представления до его подпредставлений, где необходимо рассмотреть внутреннюю непротиворечивость графа объектов. Например, в случае ячейки табличного представления, выходы к определенным подпредставлениям должны снова обычно быть слабыми. Если табличное представление содержит представление изображения и текстовое представление, то они остаются допустимыми, пока они - подпредставления самой ячейки табличного представления.
Выходы должны быть изменены на strong
когда выходу, как должны полагать, принадлежит ссылочный объект:
Как обозначено ранее, это часто имеет место с Владельцем Файла — объекты верхнего уровня в файле пера часто считаются принадлежавшими Владельцу Файла.
Вам май в некоторых ситуациях нужен объект от файла пера для существования за пределами его исходного контейнера. Например, у Вас мог бы быть выход для представления, которое может быть временно удалено из его начальной иерархии представления и должно поэтому сохраняться независимо.
Классы, что Вы ожидаете быть разделенными на подклассы (в определенных абстрактных классах) представляют выходы публично так, чтобы они могли использоваться соответственно подклассами (например. UIViewController
view
выход). Выходы могли бы также быть представлены, где существует ожидание, что потребители класса должны будут взаимодействовать со свойством; например, ячейка табличного представления могла бы представить подпредставления. В этом последнем случае может быть надлежащим представить общедоступный выход только для чтения, переопределенный конфиденциально как чтение-запись, например:
// MyClass.h |
@interface MyClass : UITableViewCell |
@property (weak, readonly) MyType *outletName; |
@end |
// MyClass.m |
@interface MyClass () |
@property (weak, readwrite) IBOutlet MyType *outletName; |
@end |
Объектам верхнего уровня в OS X, возможно, понадобится специальная обработка
По историческим причинам в OS X объекты верхнего уровня в файле пера создаются с дополнительным подсчетом ссылок. Набор Приложения предлагает несколько функций, помогающих гарантировать, что должным образом выпущены объекты пера:
NSWindow
объекты (включая панели) имеютisReleasedWhenClosed
атрибут, который, если установлено вYES
дает окну команду выпускать себя (и следовательно все зависимые объекты в его иерархии представления), когда оно закрывается. В файле пера Вы устанавливаете эту опцию через флажок «Release when closed» в области Attributes инспектора XCode.Если Владелец Файла файла пера
NSWindowController
объект (значение по умолчанию в перьях документа в основанных на документе приложениях — вспоминают этоNSDocument
управляет экземпляромNSWindowController
) илиNSViewController
объект, это автоматически избавляется от окон, которыми это управляет.
Если Владелец Файла не является экземпляром NSWindowController
или NSViewController
, тогда необходимо постепенно уменьшить подсчет ссылок объектов верхнего уровня сами. Необходимо бросить ссылки на объекты верхнего уровня к Базовому типу Основы и использованию CFRelease
. (Если Вы не хотите иметь выходы ко всем объектам верхнего уровня, можно использовать instantiateNibWithOwner:topLevelObjects:
метод NSNib
класс для получения массива пера объекты верхнего уровня файла.)
Методы действия
Вообще говоря методы действия (см. Действие Target в OS X или Действие Target в iOS) являются методами, обычно вызывающимися другим объектом в файле пера. Методы действия используют спецификатор типа IBAction
, который используется вместо void
возвратите тип, для установки флага заявленного метода как действия так, чтобы XCode знал о нем.
@interface MyClass |
- (IBAction)myActionMethod:(id)sender; |
@end |
Можно принять решение расценить методы действия, как являющиеся частным к классу и таким образом не объявить их в общественности @interface
. (Поскольку XCode анализирует файлы реализации, нет никакой потребности объявить их в заголовке.)
// MyClass.h |
@interface MyClass |
@end |
// MyClass.m |
@implementation MyClass |
- (IBAction)myActionMethod:(id)sender { |
// Implementation. |
} |
@end |
Вы не должны обычно вызывать метод действия программно. Если Ваш класс должен выполнить работу, связанную с методом действия, то Вы должны фактор реализация в различный метод, тогда вызывающийся методом действия.
// MyClass.h |
@interface MyClass |
@end |
// MyClass.m |
@interface MyClass (PrivateMethods) |
- (void)doSomething; |
- (void)doWorkThatRequiresMeToDoSomething; |
@end |
@implementation MyClass |
- (IBAction)myActionMethod:(id)sender { |
[self doSomething]; |
} |
- (void)doSomething { |
// Implementation. |
} |
- (void)doWorkThatRequiresMeToDoSomething { |
// Pre-processing. |
[self doSomething]; |
// Post-processing. |
} |
@end |
Встроенная поддержка файлов пера
AppKit и платформы UIKit и обеспечивают определенную сумму автоматизированного поведения для загрузки и управления файлами пера в приложении. Обе платформы обеспечивают инфраструктуру для загрузки основного файла пера приложения. Кроме того, платформа AppKit предоставляет поддержку для загрузки других файлов пера через NSDocument
и NSWindowController
классы. Следующие разделы описывают встроенную поддержку файлов пера, как можно использовать в своих интересах ее, и способы изменить ту поддержку в собственных приложениях.
Загрузки приложения основной файл пера
Большинство шаблонов проекта XCode для приложений уже прибывает предварительно сконфигурированное с основным файлом пера на месте. Все, что необходимо сделать, изменяют этот файл пера по умолчанию в файле пера и создают приложение. Во время запуска данные конфигурации приложения по умолчанию говорят объект приложения, где найти этот файл пера так, чтобы это могло загрузить его. В приложениях на основе любого AppKit и UIKit, это данные конфигурации расположено в приложении Info.plist
файл. Когда приложение сначала загружается, код запуска приложения по умолчанию заглядывает Info.plist
файл для NSMainNibFile
ключ. Если это находит его, это смотрит в комплекте приложений для файла пера, имя которого (с или без расширения файла) соответствует значение того ключа и загружает его.
Каждый Контроллер Представления Управляет своим Собственным Файлом Пера
UIViewController
(iOS) и NSViewController
(OS X) классы поддерживает автоматическую загрузку их связанного файла пера. Когда Вы пытаетесь получить доступ к представлению контроллера представления, при указании файла пера при создании контроллера представления тот файл пера загружается автоматически. Любые соединения между контроллером представления и объектами файла пера создаются автоматически, и в iOS, UIViewController
когда представления наконец загружены и выведены на экран на экране, объект также получает дополнительные уведомления. Помочь управлять памятью лучше, UIViewController
класс также обрабатывает разгрузку своего файла пера (как надлежащую) во время условий низкой памяти.
Для получения дополнительной информации о том, как Вы используете UIViewController
класс и как Вы конфигурируете его, см. Руководство по программированию Контроллера Представления для iOS.
Документ и загрузка контроллеров окна их связанный файл пера
В платформе AppKit, NSDocument
класс работает с контроллером окна по умолчанию для загрузки файла пера, содержащего окно документа. windowNibName
метод NSDocument
удобный метод, который можно использовать для указания файла пера, содержащего соответствующее окно документа. Когда новый документ создается, объект документа передает имя файла пера, которое Вы указываете к объекту контроллера окна по умолчанию, загружающему и управляющему содержанием файла пера. При использовании стандартных шаблонов, предоставленных XCode единственная вещь, которую необходимо сделать, добавляет содержание окна документа к файлу пера.
NSWindowController
класс также предоставляет автоматическую поддержку для загрузки файлов пера. При создании пользовательских контроллеров окна программно у Вас есть опция инициализации их с NSWindow
возразите или с именем файла пера. Если Вы выбираете последнюю опцию, NSWindowController
класс автоматически загружается, указанное перо регистрируют в первый раз, когда клиент пытается получить доступ к окну. После этого контроллер окна имеет в наличии окно в памяти; даже если “Выпуск окна, когда закрыто” атрибут установлен, это не перезагружает его от файла пера.
Загрузка файлов пера программно
И OS X и iOS обеспечивают удобные методы для загрузки файлов пера в Ваше приложение. И AppKit и платформа UIKit определяют дополнительные методы для NSBundle
класс, которые поддерживают загрузку файлов пера. Кроме того, платформа AppKit также обеспечивает NSNib
класс, обеспечивающий подобное загружающее перо поведение как NSBundle
но предложения некоторые дополнительные преимущества, которые могли бы быть полезными в особых ситуациях.
Поскольку Вы распланировали свое приложение, удостоверьтесь любые файлы пера, которые Вы планируете загрузить, вручную сконфигурированы в пути, упрощающем процесс загрузки. Выбор надлежащего объекта для Владельца Файла и хранение Ваших маленьких файлов пера могут значительно улучшить их простоту использования и эффективность памяти. Для большего количества подсказок относительно конфигурирования Ваших файлов пера см. Руководство по проектированию Файла Пера.
Загрузка файлов пера Используя NSBundle
AppKit и платформы UIKit определяют дополнительные методы для NSBundle
класс (использующий категории Objective C) для поддержки загрузку ресурсов файла пера. Семантика для того, как Вы используете методы, отличается между этими двумя платформами, как делает синтаксис для методов. В AppKit существует больше опций для доступа к пакетам в целом и таким образом, существует соответственно больше методов для загрузки файлов пера от тех пакетов. В UIKit приложения могут загрузить файлы пера только из их основного пакета и таким образом, необходимо меньше опций. Методы, доступные на этих двух платформах, следующие:
AppKit
loadNibFile:externalNameTable:withZone:
метод классаloadNibFile:externalNameTable:withZone:
метод экземпляра
UIKit
loadNibNamed:owner:options:
метод экземпляра
Загружая файл пера, необходимо всегда указывать объект действовать как Владелец Файла того файла пера. Роль Владельца Файла является важной. Это - основной интерфейс между Вашим рабочим кодом и новыми объектами, собирающимися быть созданными в памяти. Все методы загрузки пера обеспечивают способ указать Владельца Файла, или непосредственно или в качестве параметра в словаре опций.
Одним из семантических различий между способом, которым AppKit и платформы UIKit обрабатывают загрузку пера, является способ, которым объекты пера верхнего уровня возвращаются к Вашему приложению. В платформе AppKit необходимо явно запросить их использующий один из loadNibFile:externalNameTable:withZone:
методы. В UIKit, loadNibNamed:owner:options:
метод возвращает массив этих объектов непосредственно. Самый простой способ избежать иметь необходимость волноваться об объектах верхнего уровня в любом случае состоит в том, чтобы сохранить их в выходах объекта Владельца Вашего Файла (см. Управление Временами жизни Объектов от Файлов Пера).
Перечисление 1-1 показывает простой пример того, как загрузить файл пера с помощью NSBundle
класс в находящемся в AppKit приложении. Как только loadNibNamed:owner:
возвраты метода, можно начать использовать любые выходы, относящиеся к объектам файла пера. Другими словами, весь процесс загрузки пера происходит в ограничениях того единственного вызова. Методы загрузки пера в платформе AppKit возвращают булево значение, чтобы указать, была ли работа загрузки успешна.
Перечисление 1-1 , Загружающее файл пера из текущего пакета
- (BOOL)loadMyNibFile |
{ |
// The myNib file must be in the bundle that defines self's class. |
if (![NSBundle loadNibNamed:@"myNib" owner:self]) |
{ |
NSLog(@"Warning! Could not load myNib file.\n"); |
return NO; |
} |
return YES; |
} |
Перечисление 1-2 показывает пример того, как загрузить файл пера в находящемся в UIKit приложении. В этом случае метод проверяет возвращенный массив, чтобы видеть, были ли объекты пера загружены успешно. (Каждый файл пера должен иметь по крайней мере один объект верхнего уровня, представляющий содержание файла пера.) Когда файл пера не содержит объектов местозаполнителя кроме объекта Владельца Файла, этот пример показывает простой случай. Для примера того, как указать дополнительные объекты местозаполнителя, посмотрите Объекты Прокси Замены во Время загрузки.
Перечисление 1-2 , Загружающее перо в приложении для iPhone
- (BOOL)loadMyNibFile |
{ |
NSArray* topLevelObjs = nil; |
topLevelObjs = [[NSBundle mainBundle] loadNibNamed:@"myNib" owner:self options:nil]; |
if (topLevelObjs == nil) |
{ |
NSLog(@"Error! Could not load myNib file.\n"); |
return NO; |
} |
return YES; |
} |
Получение пера объекты верхнего уровня файла
Самый простой способ получить объекты верхнего уровня Вашего файла пера состоит в том, чтобы определить выходы в объекте Владельца Файла вместе с методами установщика (или еще лучше, свойства) для доступа к тем объектам. Этот подход гарантирует, что объекты верхнего уровня сохраняются Вашим объектом и что у Вас всегда есть ссылки на них.
Перечисление 1-3 показывает интерфейс и реализацию упрощенного класса Какао, использующего выход для сохранения единственного объекта верхнего уровня файла пера. В этом случае единственный объект верхнего уровня в файле пера NSWindow
объект. Поскольку объекты верхнего уровня в Какао имеют начальную букву, сохраняют количество 1, дополнительное сообщение выпуска включено. Это прекрасно, потому что к тому времени, когда вызов выпуска выполняется, свойство было уже сохранено окно. Вы не хотели бы выпускать объекты верхнего уровня этим способом в приложении для iPhone.
Перечисление 1-3 Используя выходы для получения объектов верхнего уровня
// Class interface. |
@interface MyController : NSObject |
- (void)loadMyWindow; |
@end |
// Private class extension. |
@interface MyController () |
@property (strong) IBOutlet NSWindow *window; |
@end |
// Class implementation |
@implementation MyController |
- (void)loadMyWindow { |
[NSBundle loadNibNamed:@"myNib" owner:self]; |
// The window starts off with a retain count of 1 |
// and is then retained by the property, so add an extra release. |
NSWindow *window = self.window; |
CFRelease(__bridge window); |
} |
@end |
Если Вы не хотите использовать выходы для хранения ссылок на объекты верхнего уровня файла пера, необходимо получить те объекты вручную в коде. Метод для получения объектов верхнего уровня отличается в зависимости от целевой платформы. В OS X необходимо попросить объекты явно, тогда как в iOS они возвращаются Вам автоматически.
Перечисление 1-4 показывает процесс для получения объектов верхнего уровня файла пера в OS X. Этот метод помещает непостоянный массив в nameTable
словарь и партнеры это с NSNibTopLevelObjects
ключ. Загружающий перо код ищет этот объект массива и если есть помещает объекты верхнего уровня в него. Поскольку каждый объект запускается с сохранить количества 1, прежде чем он будет добавлен к массиву, просто выпущения массива недостаточно для выпуска объектов в массиве также. В результате этот метод отправляет сообщение выпуска в каждый из объектов гарантировать, что массив является единственным объектом, содержащим ссылку на них.
Перечисление 1-4 , Получающее объекты верхнего уровня от файла пера во время выполнения
- (NSArray*)loadMyNibFile |
{ |
NSBundle* aBundle = [NSBundle mainBundle]; |
NSMutableArray* topLevelObjs = [NSMutableArray array]; |
NSDictionary* nameTable = [NSDictionary dictionaryWithObjectsAndKeys: |
self, NSNibOwner, |
topLevelObjs, NSNibTopLevelObjects, |
nil]; |
if (![aBundle loadNibFile:@"myNib" externalNameTable:nameTable withZone:nil]) |
{ |
NSLog(@"Warning! Could not load myNib file.\n"); |
return nil; |
} |
// Release the objects so that they are just owned by the array. |
[topLevelObjs makeObjectsPerformSelector:@selector(release)]; |
return topLevelObjs; |
} |
Получение объектов верхнего уровня в приложении для iPhone намного более просто и показано в Перечислении 1-2. В платформе UIKit, loadNibNamed:owner:options:
метод NSBundle
автоматически возвращает массив с объектами верхнего уровня. Кроме того, к тому времени, когда массив возвращается, сохранение рассчитывает на объекты, корректируются так, чтобы Вы не должны были отправлять каждому объекту дополнительное сообщение выпуска. Возвращенный массив является единственным владельцем объектов.
Загрузка файлов пера Используя UINib и NSNib
UINib
(iOS) и NSNib
Классы (OS X) обеспечивают лучшую производительность в ситуациях, где Вы хотите создать многократные копии пера содержание файла. Нормальный процесс загрузки пера включает чтение файла пера от диска и затем инстанцирования объектов, которые это содержит. Однако с UINib
и NSNib
классы, файл пера читается из диска один раз, и содержание сохранено в памяти. Поскольку они находятся в памяти, создание последовательных наборов объектов занимает меньше времени, потому что это не требует доступа к диску.
Используя UINib
и NSNib
классы всегда являются двухступенчатым процессом. Во-первых, Вы создаете экземпляр класса и инициализируете его с информацией о расположении файла пера. Во-вторых, Вы инстанцируете содержания файла пера для загрузки объектов в память. Каждый раз, когда Вы инстанцируете файла пера, Вы указываете, что Владелец различного Файла возражает и получает новый набор объектов верхнего уровня.
Перечисление 1-5 показывает один способ загрузить содержание файла пера с помощью NSNib
класс в OS X. Массив возвратился к Вам instantiateNibWithOwner:topLevelObjects:
метод уже прибывает автовыпущенный. Если Вы намереваетесь использовать тот массив в течение какого-либо промежутка времени, необходимо сделать копию из него.
Перечисление 1-5 , Загружающееся файл пера с помощью NSNib
- (NSArray*)loadMyNibFile |
{ |
NSNib* aNib = [[NSNib alloc] initWithNibNamed:@"MyPanel" bundle:nil]; |
NSArray* topLevelObjs = nil; |
if (![aNib instantiateNibWithOwner:self topLevelObjects:&topLevelObjs]) |
{ |
NSLog(@"Warning! Could not load nib file.\n"); |
return nil; |
} |
// Release the raw nib data. |
[aNib release]; |
// Release the top-level objects so that they are just owned by the array. |
[topLevelObjs makeObjectsPerformSelector:@selector(release)]; |
// Do not autorelease topLevelObjs. |
return topLevelObjs; |
} |
Замена объектов прокси во время загрузки
В iOS возможно создать файлы пера, включающие объекты местозаполнителя помимо Владельца Файла. Объекты прокси представляют объекты, создаваемые за пределами файла пера, но которые имеют некоторое соединение с содержанием файла пера. Прокси обычно используются для поддержки контроллеров навигации в приложениях для iPhone. При работе с контроллерами навигации Вы обычно подключаете объект Владельца Файла к некоторому общему объекту, такому как Ваш делегат приложения. Объекты прокси поэтому представляют части иерархии объектов контроллера навигации, уже загружающиеся в памяти, потому что они создавались программно или загрузились от различного файла пера.
Каждый объект местозаполнителя, который Вы добавляете к файлу пера, должен иметь уникальное имя. Для присвоения имени к объекту выберите объект в XCode и откройте окно инспектора. Область Attributes инспектора содержит Поле имени, которое Вы используете для указания имени для объекта местозаполнителя. Имя, которое Вы присваиваете, должно быть дескриптивным из поведения или типа объекта, но действительно это может быть что-либо, что Вы хотите.
Когда Вы готовы загрузить файл пера, содержащий объекты местозаполнителя, необходимо указать заменяющие объекты для любых прокси, когда Вы вызываете loadNibNamed:owner:options:
метод. Параметр опций этого метода принимает словарь дополнительной информации. Вы используете этот словарь для передачи в информации об объектах местозаполнителя. Словарь должен содержать UINibExternalObjects
ключ, значение которого является другим словарем, содержащим имя и объект для каждой замены заполнителя.
Перечисление 1-6 показывает демонстрационную версию applicationDidFinishLaunching:
метод, загружающий основной файл пера приложения вручную. Поскольку объект делегата приложения создается UIApplicationMain
функция, этот метод использует заполнителя (с именем «AppDelegate») в основном файле пера для представления того объекта. Словарь прокси хранит информацию объекта местозаполнителя и обертки словаря опций тот словарь.
Перечисление 1-6 , Заменяющее объекты местозаполнителя в файле пера
- (void)applicationDidFinishLaunching:(UIApplication *)application |
{ |
NSArray* topLevelObjs = nil; |
NSDictionary* proxies = [NSDictionary dictionaryWithObject:self forKey:@"AppDelegate"]; |
NSDictionary* options = [NSDictionary dictionaryWithObject:proxies forKey:UINibExternalObjects]; |
topLevelObjs = [[NSBundle mainBundle] loadNibNamed:@"Main" owner:self options:options]; |
if ([topLevelObjs count] == 0) |
{ |
NSLog(@"Warning! Could not load myNib file.\n"); |
return; |
} |
// Show window |
[window makeKeyAndVisible]; |
} |
Для получения дополнительной информации о словаре опций loadNibNamed:owner:options:
метод, см. NSBundle UIKit Дополнительная Ссылка.
Доступ к содержанию файла пера
После успешной загрузки файла пера его содержание становится готовым к Вам сразу использовать. При конфигурировании выходов во Владельце Файла для указания на объекты файла пера, можно теперь использовать те выходы. Если бы Вы не конфигурировали Владельца своего Файла ни с какими выходами, то необходимо удостовериться, что Вы получаете ссылку на объекты верхнего уровня некоторым способом так, чтобы можно было выпустить их позже.
Поскольку выходы заполняются с реальными объектами, когда файл пера загружается, можно впоследствии использовать выходы, поскольку Вы были бы любой другой объект, который Вы создали программно. Например, если у Вас есть выход, указывающий на окно, Вы могли бы отправить то окно a makeKeyAndOrderFront:
обменивайтесь сообщениями для показа его на экране пользователя. Когда Вы сделаны с помощью объектов в файле пера, необходимо выпустить их как любые другие объекты.
Соединение пунктов меню через файлы пера
Элементы в строке меню приложения OS X часто должны взаимодействовать со многими различными объектами, включая документы и окна Вашего приложения. Проблема состоит в том, что многие из этих объектов не могут (или не должен) быть полученным доступ непосредственно от основного файла пера. Владелец Файла основного файла пера всегда устанавливается в экземпляр NSApplication
класс. И несмотря на то, что Вы могли бы быть в состоянии инстанцировать многих пользовательских объектов в своем основном файле пера, делание так едва практично или необходимо. В случае объектов документа, соединяясь непосредственно с определенным объектом документа даже не возможно, потому что число объектов документа может измениться динамично и может даже быть нулем.
Большинство пунктов меню отправляет сообщения действия в одно из следующего:
Фиксированный объект, всегда обрабатывающий команду
Динамический объект, такой как документ или окно
Обмен сообщениями фиксированных объектов является относительно прямым процессом, обычно лучше всего обрабатывающимся через делегата приложения. Делегат приложения объект помогает NSApplication
объект в запуске приложения и является одним из нескольких объектов, законно принадлежащим основного файла пера. Если пункт меню относится к команде прикладного уровня, можно реализовать ту команду непосредственно в делегате приложения или просто сделать, чтобы делегат передал сообщение к надлежащему объекту в другом месте в приложении.
Если у Вас есть пункт меню, действующий на содержание frontmost окна, необходимо соединить пункт меню с Первым объектом местозаполнителя Респондента. Если метод действия, связанный с пунктом меню, является определенным для одного из Ваших объектов (и не определенный Какао), необходимо добавить что действие к Первому Респонденту прежде, чем создать соединение.
После создания соединения необходимо реализовать метод действия в пользовательском классе. Тот объект должен также реализовать validateMenuItem:
метод для включения пункта меню в подходящее время. Для получения дополнительной информации о том, как цепочка респондента обрабатывает команды, посмотрите Руководство по Обработке событий Какао.