Как заставить приложение OS X реагировать, когда файл, изображение и т.д. Удаляется на значке док-станции?

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

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

Ответы

Ответ 1

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

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

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

- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication

.

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

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

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

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

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

Ответ 2

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

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

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