Используя открытое и сохраняют панели

При работе с пользовательскими документами и файлами в OS X, пользователь должен решить, где те файлы находятся в файловой системе. Стандартные панели Open и Save предоставляют Вам интерфейс для использования каждый раз, когда Вы взаимодействуете с файлами пользователя. Вы представляете панель Open, когда Вы хотите, чтобы пользователь выбрал один или несколько существующих файлов или каталогов. Представьте панель Save, когда у Вас есть новый пользовательский документ, который необходимо записать в диск.

Открытая панель: получение существующих файлов или каталогов

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

Открытие пользовательских документов, которые Вы планируете вывести на экран в новом окне

Когда Вы захотите попросить, чтобы пользователь выбрал документ для отображения в новом окне, выведите на экран стандартную панель Open модально. Основанные на документе приложения обычно предоставляют это поведение Вам автоматически, обеспечивание инфраструктуры должно было реагировать на команду Open в меню. Для отображения этой панели в других ситуациях можно реализовать собственный метод для отображения панели. Шаги для создания и представления панели Open самостоятельно следующие:

  1. Используйте openPanel метод класса NSOpenPanel получать объект панели Open.

  2. Представьте панель с помощью beginWithCompletionHandler: метод.

  3. Используйте свой обработчик завершения для обработки результатов.

Перечисление 5-1 показывает пользовательский метод, представляющий стандартную панель Open пользователю. Эта панель использует параметры конфигурации по умолчанию, поддерживающие выбор единственного файла от всех доступных типов файлов. beginWithCompletionHandler: метод выводит на экран панель в отдельном окне и возвратах сразу. Когда элемент выбран, панель работает модально относительно приложения и вызывает предоставленный обработчик завершения на основном потоке приложения. После успешного выбора документа необходимо обеспечить код, чтобы открыть документ и представить его окно.

Перечисление 5-1  , Представляющее панель Open пользователю

- (IBAction)openExistingDocument:(id)sender {
   NSOpenPanel* panel = [NSOpenPanel openPanel];
 
   // This method displays the panel and returns immediately.
   // The completion handler is called when the user selects an
   // item or cancels the panel.
   [panel beginWithCompletionHandler:^(NSInteger result){
      if (result == NSFileHandlingPanelOKButton) {
         NSURL*  theDoc = [[panel URLs] objectAtIndex:0];
 
         // Open  the document.
      }
 
   }];
}

В основанном на документе приложении запросы для отображения панели Open обработаны openDocument: метод объекта контроллера документа приложения, который является частью цепочки респондента приложения по умолчанию. Вместо того, чтобы реализовать Ваш собственный Открытый код сигнализации полотнищами, Вы могли бы рассмотреть вызов openDocument: метод вместо этого. Выполнение так гарантирует, чтобы Ваш пользовательский код и инфраструктура приложений по умолчанию всегда выводили на экран ту же панель Open. Настройка панели в более позднее время также становится проще, потому что необходимо внести изменения только в одном месте.

Для получения дополнительной информации о реализации основанного на документе приложения, см. Руководство по программированию Приложения Mac.

Выбор файлов и каталогов для уже открытого окна

Для выбора файлов или каталогов, касающихся текущего окна сконфигурируйте стандартную панель Open как панель Choose и используйте его для получения выбора пользователя. Основное различие между стандартной панелью Open и панелью Choose - то, как Вы представляете его. Принимая во внимание, что Вы представляете стандартную панель Open как автономную модальную панель, Вы почти всегда присоединяете панель Choose к одному из Ваших существующих окон. Присоединение панели к окну делает его модальным к окну, но не к Вашему целому приложению. Другие различия касаются конфигурации самой панели. Панель Choose может быть сконфигурирована для разрешения выбора каталогов, многократных элементов или скрытых элементов среди других опций.

NSOpenPanel объект, возвращенный openPanel метод сконфигурирован со следующими опциями по умолчанию:

  • Выбор файла: включенный

  • Выбор каталога: отключенный

  • Псевдонимы решения: включенный

  • Множественный выбор: отключенный

  • Покажите скрытые файлы: отключенный

  • Пакеты файла, обработанные как каталоги: отключенный

  • Может создать каталоги: отключенный

Перечисление 5-2 показывает метод, который Вы могли бы реализовать в одном из Вашего NSDocument подклассы, чтобы импортировать некоторые файлы и связать их с документом. После конфигурирования панели этот метод использует beginSheetModalForWindow:completionHandler: метод для представления панели как листа, присоединенного к главному окну документа. Если пользователь выбирает некоторые файлы, URLs метод содержит соответствующий файл и ссылки каталога для слияния.

Перечисление 5-2  , Связывающее панель Open с окном

- (IBAction)importFilesAndDirectories:(id)sender {
   // Get the main window for the document.
   NSWindow* window = [[[self windowControllers] objectAtIndex:0] window];
 
   // Create and configure the panel.
   NSOpenPanel* panel = [NSOpenPanel openPanel];
   [panel setCanChooseDirectories:YES];
   [panel setAllowsMultipleSelection:YES];
   [panel setMessage:@"Import one or more files or directories."];
 
   // Display the panel attached to the document's window.
   [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result){
      if (result == NSFileHandlingPanelOKButton) {
         NSArray* urls = [panel URLs];
 
         // Use the URLs to build a list of items to import.
      }
 
    }];
}

Для приложений единственного окна свяжите открытую панель с главным окном своего приложения. Для основанных на документе приложений свяжите его с главным окном текущего документа.

Панель сохранения: получение нового имени файла

Для основанных на документе приложений запросы для сохранения текущего документа должны быть обработаны самим объектом документа. NSDocument класс реализует сложную инфраструктуру, чтобы управлять обоими панель Save и сохранить связанные операции, такие как автоматическое сохранение. В результате объект документа часто настраивает панель Save по умолчанию значительно, и кроме создания дополнительных настроек не рекомендуют через существующее NSDocument методы. Вы могли все еще использовать пользовательскую панель Save для обработки экспорта файлов с помощью различных форматов файлов.

Если Вы не используете NSDocument инфраструктура, можно создать собственные панели Save и вывести на экран их в подходящее время. NSSavePanel класс обеспечивает методы для создания и настройки панели Save по умолчанию. При реализации собственной инфраструктуры документа ограничьте использование панели Save к документам, которые пользователь создает и хочет сохранить. Не используйте панель Save для файлов, которые Ваше приложение создает и управляет неявно. Например, iPhoto не предлагает пользователю указывать расположение его основного файла библиотеки; это создает файл в известном расположении без любого взаимодействия с пользователем. Когда пользователь экспортирует изображение в диск, Однако iPhoto действительно представляет панель Save.

Перечисление 5-3 показывает метод, что объект документа мог бы вызвать при экспорте файла в новый тип. Этот метод собирает новое имя файла с существующего имени документа и новый сохраняемый тип. Это тогда дарит панели Save новый набор имени как значение по умолчанию и инициирует работу сохранения как надлежащую.

Перечисление 5-3  , Сохранившее файл с новым типом

 
- (void)exportDocument:(NSString*)name toType:(NSString*)typeUTI
{
   NSWindow*       window = [[[self windowControllers] objectAtIndex:0] window];
 
   // Build a new name for the file using the current name and
   // the filename extension associated with the specified UTI.
   CFStringRef newExtension = UTTypeCopyPreferredTagWithClass((CFStringRef)typeUTI,
                                   kUTTagClassFilenameExtension);
   NSString* newName = [[name stringByDeletingPathExtension]
                       stringByAppendingPathExtension:(NSString*)newExtension];
   CFRelease(newExtension);
 
   // Set the default name for the file and show the panel.
   NSSavePanel*    panel = [NSSavePanel savePanel];
   [panel setNameFieldStringValue:newName];
   [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result){
        if (result == NSFileHandlingPanelOKButton)
        {
            NSURL*  theFile = [panel URL];
 
            // Write the contents in the new format.
        }
    }];
}

Для получения дополнительной информации о реализации основанного на документе приложения, см. Руководство по программированию Приложения Mac.

Используя фильтры для ограничения типов файлов, которые может выбрать пользователь

Если Ваше приложение в состоянии открыть только определенные типы файлов, можно использовать фильтрацию для ограничения выборов пользователя подмножеством файлов, которые фактически поддерживает приложение. Панель Open не ограничивает типы файлов, которые пользователь может выбрать по умолчанию. Препятствовать тому, чтобы пользователь выбрал, регистрирует Ваше приложение, не может обработать, установить один или несколько фильтров на панели Open. Файлы, не соответствующие предоставленные фильтры, недоступны панелью Open и не могут быть выбраны пользователем. Можно также установить фильтры на панели Save для потускнения неизвестных типов файлов.

Вы указываете фильтры как UTIs, расширения файла или комбинацию двух. После сбора Ваших строк фильтра в массив Вы присваиваете их панели с помощью setAllowedFileTypes: метод. Панель обрабатывает фактическую фильтрацию файлов для Вас. В то время как панель видима, можно изменить фильтры.

Перечисление 5-4 показывает пример того, как сконфигурировать панель Open для разрешения выбора типов изображения только. NSImage класс обеспечивает удобный метод для получения поддерживаемых типов изображения. Поскольку строки в возвращенном массиве являются UTIs, результаты вручены непосредственно панели.

  Фильтрация перечисления 5-4 для типов файла изображения

- (IBAction)askUserForImage:(id)sender {
   NSOpenPanel*    panel = [NSOpenPanel openPanel];
 
   // Let the user select any images supported by
   // the NSImage class.
   NSArray* imageTypes = [NSImage imageTypes];
   [panel setAllowedFileTypes:imageTypes];
 
   [panel beginWithCompletionHandler:^(NSInteger result){
      if (result == NSFileHandlingPanelOKButton) {
         // Open the image.
      }
 
   }];
}

Добавление вспомогательного представление к открытому и сохраняет панели

Для подарить пользователю дополнительные опции, открываясь или сохранив файлы добавьте вспомогательное представление к стандартным панелям Open и Save. Обычно, панели Open и Save обрабатывают события и обрабатывают все взаимодействия, пока пользователь не отменяет или принимает результаты. Вспомогательное просматривает, позволяет Вам добавить пользовательские элементы управления и представления для сбора информации или изменить поведение самой панели. Например, Вы могли бы использовать пользовательские элементы управления, чтобы изменить набор фильтров, используемых панелью или изменить опции Ваше собственное использование кода, открываясь или сохранив файл.

Базовый процесс для добавления вспомогательного представление к панели Open или Save следующие:

  1. Загрузите вспомогательное представление из файла пера. (Можно создать представления аксессуара программно также, но использование файла пера часто проще.)

  2. Создайте панель.

  3. Свяжите свое представление с панелью с помощью setAccessoryView: метод.

  4. Покажите панель.

Сравните предыдущие шаги с отображением панели обычно, и единственная разница загружает Ваше представление и вызывает setAccessoryView: метод. Вся другая работа, требуемая управлять вспомогательным представление и реагировать на события, является Вашей ответственностью.

Определение содержания Вашего вспомогательного представление

Поскольку вспомогательное просматривает, просто другое представление, Вы определяете его способ, которым Вы определяете другие представления в своем приложении. Вспомогательное представление всегда состоит из единственного основного представления, которое может самостоятельно содержать любое число подпредставлений. Наиболее распространенная конфигурация для вспомогательного представление как узел к одним или более средствам управления. Когда пользователь взаимодействует со средствами управления в Вашем вспомогательном представление, те средства управления используют шаблон разработки целевого действия для вызова пользовательского кода приложения. Можно тогда использовать тот код, чтобы сохранить параметры конфигурации или принять любые соответствующие меры.

Файл пера является самым простым способом определить вспомогательное представление. Перед установкой файла пера необходимо знать, какой объект в приложении собирается представить панель. Например, в основанном на документе приложении, Вашем NSDocument подкласс обычно ответственен за отображение любых панелей Open и Save. В целом объекту, представляющему панель, должно также принадлежать содержание вспомогательного представление. С этим в памяти, конфигурация Вашего файла пера была бы следующие:

  1. Создайте новый файл пера, содержание которого является единственным представлением.

  2. Установите Владельца Файла файла пера к объекту, представляющему панель.

  3. Сконфигурируйте содержание высокоуровневого объекта представления файла пера.

    • Добавьте любые подпредставления, такие как флажки, что Вы хотите включать во вспомогательное представление.

    • Можно изменить класс объекта представления верхнего уровня, если Вы хотите, но так не требуется выполнение. Если Вы используете универсальное представление в качестве основного представления, базовая панель обеспечивает надлежащее фоновое появление для остальной части Вашего содержания.

  4. Действия подключения (как надлежащий) к Вашим представлениям для упрощения взаимодействий с пользовательским кодом. Необходимо реализовать сами методы действия в объекте, который Вы присвоили как Владелец Файла.

  5. Выходы подключения (как соответствующие) для любых средств управления Вы используете для сбора данных пассивно от пользователя. Обработчик завершения для панели может тогда использовать выходы для доступа к данным в средствах управления.

  6. Измерьте Ваш вспомогательный представление, чтобы быть как можно меньше, все еще показывая все подпредставления в их полноте.

  7. Сохраните файл пера.

При отображении вспомогательного представление панели Open и Save показывают всему вспомогательному представление. Если Ваш вспомогательный представление больше, чем сама панель, панель растет для размещения представления. Если панель становится слишком большой, это могло бы выглядеть странным или могло бы вызвать проблемы на меньших экранах. Самый вспомогательный представления должны иметь только несколько средств управления так или иначе. Таким образом, если Вы добавляете больше чем десять средств управления, Вы могли бы хотеть рассмотреть, ли вспомогательное, представление является надлежащим или если существует лучший способ собрать информацию.

Для получения дополнительной информации о конфигурировании Ваших представлений и остальной части Вашего файла пера, см. Обзор XCode.

Загрузка и конфигурирование Вашего вспомогательного представление во время выполнения

Сразу прежде, чем вывести на экран панель Open или Save, загрузка (или создать) Ваш вспомогательный представление и присоединяют его к панели с помощью setAccessoryView: метод. При создании Вашего вспомогательного представление программно Вы обычно создаете его прямо прежде, чем представить саму панель. При хранении Вашего вспомогательного представление в файле пера Вы загружаете тот файл пера сначала.

При загрузке файла пера для вспомогательного, представление относительно просто, пока сам файл пера сконфигурирован должным образом. Самый простой способ сконфигурировать файл пера состоит в том, чтобы присвоить объект, представляющий панель как Владельца Файла самого файла пера. Тем путем любые выходы и действия, определенные на объекте, соединяются автоматически и готовые использовать, как только файл пера загружается в память. Перечисление 5-5 показывает пример того, как это работает. Метод в этом примере реализован на NSDocument объект. Когда вызвано, метод дарит панели Open вспомогательное представление, присоединенное к главному окну документа. Само вспомогательное представление содержит единственный флажок, подключенный к пользовательскому optionCheckbox выход, который определяет объект документа. (Сам выход реализован с помощью свойства.) Блок обработчика использует значение флажка, чтобы определить, как открыть файл.

Перечисление 5-5  , Загружающее файл пера вспомогательным представление

- (IBAction)openFileWithOptions:(id)sender {
   NSOpenPanel*    panel = [NSOpenPanel openPanel];
   NSWindow*       window = [[[self windowControllers] objectAtIndex:0] window];
 
   // Load the nib file with the accessory view and attach it to the panel.
   if ([NSBundle loadNibNamed:@"MyAccessoryView" owner:self])
      [panel setAccessoryView:self.accessoryView];
 
   // Show the open panel and process the results.
   [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result){
      if (result == NSFileHandlingPanelOKButton) {
         BOOL option1 = ([self.optionCheckbox state] == NSOnState);
 
         // Open the selected file using the specified option...
      }
   }];
}

Если Вы создаете Ваш вспомогательный представление программно, заменяете if оператор, содержащий вызов к loadNibNamed:owner: метод с Вашим пользовательским кодом создания представления.

Для получения дополнительной информации о том, как загрузить объекты из файлов пера, см. Руководство по программированию Ресурса.