我以为我在为应用程序委托中的“打开”菜单命令重写处理程序时非常巧妙:
- (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 的开发人员门户通用/搜索页面。)