В этой части - как вывести диалог открытия файлов и получить из него список файлов, выбранных пользователем.
Диалог открытия файлов
Чтобы получить список файлов, которые хочет открыть пользователь, нужно сделать две вещи:
1. Показать пользователю диалог открытия файлов. Это стандартное действие, нужно только вызвать его.
2. Обработать результат взаимодействия пользователя с диалогом, т.е. прочитать список выбранных файлов.
Ну и далее с этим списком можно что-то сделать. В данном случаем просто выведем простейшее окошко-уведомление с этим списком.
Открываем файл AppDelegate.m и добавляем в него следующий код:
---- код ----
// Диалог открытия файлов
- (IBAction)showFileDialog:(id)sender {
// Создать диалог
NSOpenPanel *openDlg = [NSOpenPanel openPanel];
// Свойства диалога
[openDlg setCanChooseFiles:YES];
[openDlg setCanChooseDirectories:YES];
[openDlg setAllowsMultipleSelection:YES];
// Вывести диалог модально
// Если запуск вернул нажатие кнопки OK - обработать выбранные файлы
if ( [openDlg runModal] == NSFileHandlingPanelOKButton ) {
// Список выбранных файлов
NSArray *files = [openDlg URLs];
// Показать выбранные файлы
NSAlert *alert = [[NSAlert alloc] init];
[alert setMessageText:[files componentsJoinedByString:@",\n"]];
[alert runModal];
}
}---- код ----
Обратите внимание на условие if - в нем диалог выводится на экран и одновременно программа останавливается и ждет результата взаимодействия пользователя с диалогом. Если пользователь нажмет в диалоге кнопку "Open", то диалог возвратит NSFileHandlingPanelOKButton и условие станет истинным. Условие сработает и начнется обработка списка выбранных файлов.
Конечным результатом выполнения этого кода является объект files - список выбранных файлов. Его можно опередать куда-то дальше и сделать с ним что-то осмысленное. В данном случаем, как я уже говорил выше, просто выведем список файлов в уведомлении, слепив значения массива в строку через разделитель - запятую.
Кнопка открытия диалога
Открывем файл интерфейса MainMenu.xib и перетаскиваем в окно программы из библиотеки объектов одну стандартную нажимаемую кнопку. Для красоты переименуем ее в "Open...".
1. Кнопка открытия диалога
Теперь нужно свзязать кнопку с функцией, которую она должна вызывать.
Щелкаем объект "App Delegate" на панели объектов, открываем инспектор связей. В инспекторе, в списке "Received Actions" находим нашу функцию "showFileDialog". Затем протягиваем связь от функции к кнопке "Open...".
2. Кнопка "Open..." связана с функцией "showFileDialog"
Компилируем и запускаем
Нажатие кнопки "Open..." вызовет на экран стандартный диалог выбота файлов.
3. Диалог выбора файлов
Обратите внимание - диалог на английском, несмотря на то, что система у меня на русском. Это потому, что в нашем приложении не сделана русская локализация. Соответственно, приложение имеет язык по умолчанию - английский. Выдаваемые приложением диалоги тоже будут на английском.
В открывшемся диалоге можно:
1) Нажать "Cancel" - диалог закроется, ничего не произойдет
2) Нажать "Open" - диалог закроется, выбранным файлом будет считаться текущая папка "Мои файлы"
3) Выбрать какие-либо файлы и папки и нажать "Open" - диалог закроется, выбранными файлами будут считаться... эээ... выбранные файлы и папки
Что имено можно выбрать - задается в коде функции "showFileDialog", путем установки свойств диалога. У нас сейчас разрешено выбирать:
1) Файлы (setCanChooseFiles:YES)
2) Папки (setCanChooseDirectories:YES)
3) Выбирать несколько файлов и папок одновременно (setAllowsMultipleSelection:YES)
Эти свойства можно включать/выключать по отдельности.
После выбора каких-нибудь файлов/папок и нажатия кнопки "Open" диалог закроется и выбранный список будет выведен в окошке уведомления.
4. Уведомление с открытыми файлами
Видно, что выбраны папка "Downloader Pro" и файл "PCBSD9.0-x86-DVD.iso". Диалог выбора файлов не делает принципиального различия между папками и файлами, он просто возвращает путь в файловой системе, а что там по этому пути находится - его не касается. Поэтому разбираться с тем, что именно было выбрано, нужно будет самостоятельно.
Репозиторий, бранч
filedialog Часть 3. Локализация приложения Часть 5. Работа с файлами