Как приложение может отправить (основное) событие 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.

Другие вопросы по тегам