2012-04-11 92 views
2

我正在嘗試創建一個顯示SavePanel的Cocoa應用程序,並且在用戶選擇文件後,它將它打印在標準輸出上。我完全用Objective-C和Cocao開始。問題在於它不需要鍵盤輸入,只能用鼠標選擇文件。只有NSSavePanel的可可應用程序

這是代碼:

#import <Cocoa/Cocoa.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    NSSavePanel *sPanel = [NSSavePanel savePanel]; 
    int result = [sPanel runModal]; 
    if (result == NSOKButton) { 
     NSString * filename = [sPanel filename]; 
     char * fileStr = [filename UTF8String]; 
     printf("%s\n", fileStr); 
    } 
    return 0; 
} 
+1

如果目標是學習Cocoa,則從Cocoa應用程序開始。如果目標是嘗試將實際UI與shell腳本集成,請解決該問題並將shell功能包裝在真實應用程序中。我已經看到很多將UI與基於命令行的工作流集成的嘗試,並且它們普遍很糟糕。 – bbum 2012-04-11 16:54:10

回答

1

該了AppKit/Cocoa類需要的NSApplication目的是爲了處理(除其他外)的用戶輸入來初始化。添加此行到您的主函數的頂部應該做的伎倆:

int main(int argc, char *argv[]) 
{ 
    [NSApplication sharedApplication]; // ** Add this ** 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSSavePanel *sPanel = [NSSavePanel savePanel]; 
    int result = [sPanel runModal]; 
    if (result == NSOKButton) { 
     NSString * filename = [sPanel filename]; 
     const char * fileStr = [filename UTF8String]; 
     printf("%s\n", fileStr); 
    } 
    [pool drain]; 
    return 0; 
} 

關於這方面更多的信息可以在documentation for NSApplication被發現,尤其是以下幾點:

每個應用程序都必須有一個確切的實例NSApplication的子類(或 NSApplication的子類)。你的程序的main()函數應該通過調用sharedApplication類的方法來創建這個實例 。
NSApplication執行接收來自 窗口服務器的事件並將它們分發到合適的NSResponder對象的重要任務。 NSApp將事件轉換爲NSEvent對象,然後將 NSEvent對象轉發給受影響的NSWindow對象。

除了bbum及以下danielpunkass的評論的線條,這是不是你真的寫Cocoa應用程序的方式,雖然它確實讓你直接的問題去了,它不是一個完整的或完全正確的解決方案。爲了擴展Daniel的評論,並讓您輕鬆入門,請創建一個新的Cocoa應用程序項目。打開應用程序委託類(爲您創建),並將代碼放入-applicationDidFinishLaunching:方法中。正如其名稱所暗示的那樣,該方法在應用程序啓動完成後調用,並且所有設置都可以正常使用AppKit類。隨着您獲得更多的經驗,您將更好地瞭解典型的Cocoa應用程序體系結構,並可以繼續創建用戶界面等。

+2

這是正確的軌道,但僅僅建立一個頂級NSApplication是不夠的。您需要運行應用程序的主線程運行循環,才能按預期工作。無論如何,「做這項工作」的努力是錯誤的。提問者應該從Xcode中一個基本的新「可可應用程序」模板開始學習他們的知識,重點關注應用程序委託類的實驗。 – danielpunkass 2012-04-11 15:15:45

+0

這看起來似乎不應該是一個完整的解決方案,但它確實適用於這種簡單的情況,至少在我的機器上(10.7.3)。也就是說,@ bbum和danielpunkass比我更有經驗和知識淵博,並且知道他們在談論什麼。 – 2012-04-11 15:21:26

+0

我完全同意。對我而言,這很有趣,但實際上你絕不會在真實的應用程序中使用它。我更多地編輯了我的答案。 – 2012-04-11 15:31:45