Ответ 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 для вы и преобразуете их в вызовы делегатов или уведомления, которые может прослушать ваше приложение.