【发布时间】:2012-02-13 15:06:05
【问题描述】:
我正在开发一个 Cocoa / Objective C++ 实用程序应用程序,并希望处理多个(瞬时)文件打开。为了处理文件打开部分,我在我的AppDelegate.mm 文件中有这个函数:
- (BOOL)application:(NSApplication*)app openFile:(NSString *)filename
{
NSLog(@"Opening file %@", filename);
// more C++ code here
return YES;
}
文件被发送到 Quicksilver,我相信它将一个接一个地发送文件到应用程序(我认为 Finder 的“打开方式”会一次发送所有文件 - 因此可能使用 handleOpenApplicationEvent:(NSAppleEventDescriptor *)event 可能会更好那) - 但无论如何,应用程序将一个接一个地接收几个文件 - 几乎是瞬间 - 但不完全一起。这是 Console.app 显示的内容:
console-screenshot.png http://img109.imageshack.us/img109/1205/consolescreenshot.png
由于文件是单独发送的,但一个接一个,我的问题是如何收集所有发送的文件并用它们做一件事?例如,我想收集所有发送的文件路径,然后将它们一起显示在一个对话框中。
我可以想到一个可行的概念:将每个文件路径在收到时存储在一个数组中。同时,当收到第一个时,在后台设置 1-2 秒的延迟,然后有一个对话框显示所有特定变量的内容。这个概念是正确的还是有更好的方法来做到这一点?我是 Cocoa / Objective C++ 的新手——来自 PHP / Perl、bash 等语言。
我还希望这个帮助应用程序在完成后终止,但如果我正在等待文件,我如何在收到最后一个文件时终止应用程序?
如果我将[NSApp terminate:nil]; 添加到applicationDidFinishLaunching 函数中,应用程序实际上会在收到第一个文件后终止。
更新 - 更多说明
这是使用openFiles(复数)函数后的控制台:
Picture 7.png http://img24.imageshack.us/img24/5715/picture7zc.png
我使用 Quicksilver 抓取一些文件,例如临时目录中的文件,然后选择“打开方式”,然后选择我正在创建的应用程序(名为 darn.app)
但使用 Finder 似乎可以正常工作:
...结果为 consolea.app:
Picture 8.png http://img24.imageshack.us/img24/2812/picture8fe.png
我确实询问了 Quicksilver 开发人员,他们确认 QS 确实使用 Open With 操作一次打开一个文件,他们承认这与 Finder 的做法不同,但他们认为这是预期的。所以也许 Darren 是对的 - 计时器可能是最好的方法......
【问题讨论】:
-
您到底是如何使用 Quicksilver 的?这个问题的答案可能会建议一种向您的应用程序发送附加信息的方法,该信息可用于确定何时收到所有文件。