2

我以为我在为应用程序委托中的“打开”菜单命令重写处理程序时非常巧妙:

- (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:in 时-openDocument,我会在应用程序对象不期望它时发布到该全局......哦,废话。

哦,我可以提交文件进行处理,方法是把它们放在一个打开文件的 AppleEvent 中并发送给 self. 我环顾文档,发现除了我需要的所有内容:如何发送 AppleEvent 以及可能的 AppleEvent 列表及其参数。

有人可以在这里演示如何创建和发送打开文件 AppleEvent 吗?或者至少告诉我们事件 ID 和参数表在哪里?(关于脚本的各种 Cocoa 指南都参考了事件 ID 参考,但这是一个死链接,指向 Apple 的开发人员门户通用/搜索页面。)

4

1 回答 1

3

我只是猜测:

- (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”的文档以及我在 1990 年代读过的一半记忆的 Mac 编程材料。

我还浏览了 Apple 开发人员门户/Xcode 的 Legacy/Retired Documents 部分。

于 2014-08-25T15:58:08.640 回答