Как приложение может отправить (основное) событие Apple себе в Какао?
Я думал, что так ловко переписал свой обработчик для команды меню "Открыть" в делегате приложения:
- (IBAction)openDocument:(id)sender {
NSOpenPanel * const panel = [NSOpenPanel openPanel];
panel.allowsMultipleSelection = YES;
panel.delegate = self;
[panel beginWithCompletionHandler:^(NSInteger result) {
if (result == NSFileHandlingPanelOKButton) {
NSMutableArray * const paths = [NSMutableArray arrayWithCapacity:panel.URLs.count];
for (NSURL *file in panel.URLs) {
[paths addObject:file.path];
}
[self application:NSApp openFiles:paths];
}
}];
}
В старом коде, перебирая URL каждого файла, я вызывал код создания моего окна напрямую. Затем я поменял реализацию одного файла -application:openFile:
для его многофайлового варианта, и решил повторно использовать этот код в -openDocument:
,
Я думал, что это было хорошо.
Версия с одним файлом возвращает BOOL, указывающий на ее успех. Для многофайловой версии вы должны вызывать специальную функцию объекта приложения.
Я полагаю, когда вы запускаете ваше приложение с некоторыми файлами, обработчик Cocoa просматривает их с открытым файлом AppleEvent, вызывает -application:openFiles:
, ожидает установки глобального ответа, затем отправляет обратно и ответ AppleEvent. Когда я снова использую -application:openFiles:
в -openDocument
, Я публикую в этот глобальный объект, когда объект приложения не ожидает этого... О, дерьмо.
О, я мог бы отправить файлы на обработку, поместив их в открытый файл AppleEvent и отправив самому себе. Я просматриваю документы и вижу все, кроме того, что мне нужно: как отправить AppleEvent и список возможных AppleEvents и их параметры.
Может ли кто-нибудь здесь продемонстрировать, как создать и отправить открытый файл AppleEvent? Или хотя бы скажите нам, где находится таблица идентификаторов событий и параметров? (Различные руководства Какао по написанию сценариев ссылаются на ссылку на идентификатор события, но это неработающая ссылка, ведущая на страницу общего / поиска на портале разработчика Apple.)
1 ответ
Я только догадался:
- (IBAction)openDocument:(id)sender {
NSOpenPanel * const panel = [NSOpenPanel openPanel];
panel.allowsMultipleSelection = YES;
panel.delegate = self.openPanelDelegate;
[panel beginWithCompletionHandler:^(NSInteger result) {
if (result == NSFileHandlingPanelOKButton) {
NSAppleEventDescriptor * const fileList = [NSAppleEventDescriptor listDescriptor];
NSAppleEventDescriptor * const openEvent = [NSAppleEventDescriptor appleEventWithEventClass:kCoreEventClass eventID:kAEOpenDocuments targetDescriptor:nil returnID:kAutoGenerateReturnID transactionID:kAnyTransactionID];
for (NSURL *file in panel.URLs) {
[fileList insertDescriptor:[NSAppleEventDescriptor descriptorWithDescriptorType:typeFileURL data:[[file absoluteString] dataUsingEncoding:NSUTF8StringEncoding]] atIndex:0];
}
[openEvent setParamDescriptor:fileList forKeyword:keyDirectObject];
[[NSAppleEventManager sharedAppleEventManager] dispatchRawAppleEvent:[openEvent aeDesc] withRawReply:(AppleEvent *)[[NSAppleEventDescriptor nullDescriptor] aeDesc] handlerRefCon:(SRefCon)0];
}
}];
}
просматривая документы для "NSAppleEventManager.h" и "NSAppleEventDescriptor.h" и наполовину запоминая материалы по программированию на Mac, которые я читал в 1990-х годах.
Я также осмотрел раздел Legacy/Retired Documents раздела Apple Developer Portal / Xcode.