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;
}
詳細については、 NSApplication のドキュメントを参照してください。特に次の点が重要です。
すべてのアプリケーションは、NSApplication (または NSApplication のサブクラス) のインスタンスを 1 つだけ持つ必要があります。プログラムの main() 関数は、sharedApplication クラス メソッドを呼び出して、このインスタンスを作成する必要があります。
NSApplication は、ウィンドウ サーバーからイベントを受信し、それらを適切な NSResponder オブジェクトに配信するという重要なタスクを実行します。NSApp はイベントを NSEvent オブジェクトに変換し、NSEvent オブジェクトを影響を受ける NSWindow オブジェクトに転送します。
以下の bbum と danielpunkass のコメントの行に沿って、これは実際に Cocoa アプリケーションを作成する方法ではなく、差し迫った問題は解消されますが、完全または完全に正しい解決策ではありません。Daniel のコメントを拡張し、簡単に始められるように、新しい Cocoa アプリケーション プロジェクトを作成します。(作成された) アプリケーション デリゲート クラスを開き、コードを-applicationDidFinishLaunching:
メソッドに配置します。その名前が示すように、そのメソッドはアプリケーションの起動が完了した後に呼び出され、AppKit クラスを通常どおり使用できるようにすべてがセットアップされます。経験を積むにつれて、典型的な Cocoa アプリケーション アーキテクチャをよりよく理解し、ユーザー インターフェイスなどの作成に進むことができます。