捕获在MAC上使用基于文档的应用程序创建新文档的参数

时间:2014-12-08 08:58:32

标签: objective-c command-line nsdocument nsapplication nsapplication-delegate

我正在为Mac开发基于文档的应用程序。该应用程序有自己的数据模型和编写和阅读此类文档的方法。如果我想用预定义文档启动此应用程序,我可以通过以下方式执行此操作:打开命令行并键入

open -a /Applications/MyApp.app file

这只适用于参数" file"是一种MyApp文档。现在我想用另一种文档(比如文本文件或其他文件)执行MyApp。例如:

open -a /Applications/MyApp.app text.rtf

应该读取delivered/committed文本文件并将其自动插入到MyApp的完整新文档中。现在我尝试捕捉int main(int argc, char *argv[])内的 text.rtf 。但我得到以下警告:

The document text.rtf could not be opened. MyApp cannot open files of this type

有人知道如何捕获参数并将其作为基于MyApp的全新文档的一部分导入吗?如何将其发送到NSApplication?

对任何帮助都很高兴。

2 个答案:

答案 0 :(得分:2)

仅在您直接打开应用程序时才会应用在命令行上传递的文件,例如Paul R提及的方式。

Cocoa稍微启动一些应用程序,但异常情况是,执行二进制文件时,系统会要求您处理在消息中传入的文档。这意味着它们不会在argv数组中传递给您。

如果要正确处理接受所有文件类型,则需要向应用委托添加openFiles处理程序,例如:

-(void)application:(NSApplication *)sender openFiles:(NSArray *)filenames {
    for (NSString *file in filenames) {
        NSLog(@"%@", file);
    }
    [NSApp replyToOpenOrPrint:NSApplicationDelegateReplySuccess];
}

这将接受任何文件,即使是那些您未注册接受的文件。您可以嗅探文件内容并在openFiles处理程序中显示重要消息。

openFiles处理程序适用于基于文档和非文档的应用程序。

答案 1 :(得分:0)

我认为你可以通过不使用open而不是直接启动应用程序来解决这个问题,例如

/Applications/MyApp.app/Contents/MacOS/MyApp text.rtf

至少应该给你argv[1] = "text.rtf"