Как заставить приложение OS X реагировать, когда файл, изображение и т. Д. Сбрасывается на значок док-станции? - PullRequest
15 голосов
/ 01 февраля 2009

Некоторые приложения, такие как Photoshop, позволяют пользователям перетаскивать изображение из веб-браузера или перетаскивать файл из файловой системы на значок приложения в доке. При этом открывается файл в этом приложении.

Как это сделать? Я хотел бы использовать Какао и Objective-C, но меня интересуют любые решения на любых языках.

Ответы [ 2 ]

20 голосов
/ 03 февраля 2009

NSApplication позволяет вам установить делегата для вашего приложения. Если пользователь перетаскивает файл на значок док-станции, NSApplication вызовет метод

- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename

вашего объекта делегата, если он реализует любой такой метод. Если содержимое на самом деле не является файлом (например, если пользователь просто выбирает текст в приложении и перетаскивает его на значок в доке), метод делегата

- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication

называется.

См. Ссылка на класс NSApplication

По сути, вы можете просто создать любой объект любого типа (например, простой, который просто наследует NSObject), определить два вышеуказанных метода внутри объекта, а затем в любом месте своего кода запуска приложения, которое вы делаете

whatever = [[YourObject alloc] init];
[[NSApplication sharedApplication] setDelegate:whatever];

И это все. Как только файл или какой-либо другой контент помещается на значок док-станции, вызывается соответствующий метод, который должен обработать этот запрос. Кстати, те же методы вызываются, если ваше приложение связывается с типом файла (например, .myFileType), и пользователь дважды щелкает файл с таким расширением в Finder.

Что действительно происходит за кулисами, так это то, что Launch Services отправляет ваши приложение «открытые документы» («odoc») Apple Event. NSApplication по умолчанию регистрирует дескриптор для этого события и перенаправляет запрос, вызывая соответствующий метод делегата. Думаю, вы также можете напрямую послушать это событие Apple, но зачем вам это? Работать с Apple Events напрямую неудобно. Если ваше приложение не Какао, а Carbon (plain-C), вам, возможно, придется напрямую обрабатывать Apple Event (я не знаком с Carbon), но в Cocoa Apple уже ловит самые важные для вас Apple Events и конвертирует их в вызовы делегатов или уведомления, которые может прослушивать ваше приложение.

5 голосов
/ 01 февраля 2009

Если ваше приложение основано на документе, и вы правильно заполнили необходимые ключи в вашем Info.plist, то оно просто работает. Когда пользователь перетаскивает файл на плитку Dock вашего приложения, Dock выделит ваше приложение на плитке, если файл относится к типу, на который вы подписаны, и если пользователь отбросит файл там, NSDocumentController создаст один из ваших классов документов файл. Если файл не относится к типу, на который вы подписаны, оба будут его игнорировать.

Итак, ваше приложение основано на документах? Если это так, является ли файл одним из типов, на которые вы подписались?

Для получения дополнительной информации:

...