0

我正在爲基於文檔的應用程序設計一個適用於Mac的。這個應用程序有它自己的數據模型和方法來編寫和閱讀這種類型的文檔。如果我要開始預定義文檔這個應用程序,我能做到這一點的方式如下:打開命令行並輸入捕獲在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

在命令行中傳遞的文件僅適用於直接打開應用程序(例如Paul R如何提及)的應用程序。

Cocoa稍微但異常地啓動應用程序,會發生什麼情況是執行二進制文件,並要求您處理傳入消息中的文檔。這意味着它們不會在argv陣列中傳遞給您。

如果要正確處理接受所有類型的文件,你需要一個openFiles散處理程序添加到您的應用程序代理,如:

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

這將接受任何文件,即使是那些你不註冊接受。您可以嗅探文件內容並顯示相關消息,作爲openFiles處理程序的一部分。

openFiles處理程序適用於基於文檔和非基於文檔的應用程序。

+0

是不是一樣 ' - (無效)的applicationDidFinishLaunching:(NSNotification *)aNotification { 的NSArray * argsPath = [[NSProcessInfo processInfo]參數]; NSURL * url = [NSURL fileURLWithPath:[argsPath objectAtIndex:1]]; _argFile = [File initWithURL:url]; }' 使用'NSProcessInfo'我可以對所有參數做一個請求。現在我想在另一個類中使用@property argFile。 – 3ef9g 2014-12-08 16:50:17

+0

是否可以在另一個類中使用來自AppDelegate的屬性? – 3ef9g 2014-12-08 16:59:15

+0

不一樣 - 應用程序在NSApplication的參數中沒有收到目標文件;另外如果應用程序已經啓動,你也不會在那裏獲得參數。對於(2)你必須將屬性值發送到類的另一個實例 - 我不知道你的應用程序設計,以建議代碼將看起來像 – Petesh 2014-12-08 16:59:56

0

我想你可以通過不使用open而直接啓動應用程序來解決此問題,例如,

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

這應該至少給你argv[1] = "text.rtf"