2012-04-11 6 views
2

SavePanelを表示するCocoaアプリケーションを作成しようとしています。ユーザーがファイルを選択した後、stdoutに出力します。私は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とシェルスクリプトを統合しようとするのが目的なら、問題を回して、実際のアプリでシェル機能をラップしてください。 UIをコマンドラインベースのワークフローに統合しようとする試みがたくさんありました。 – bbum

答えて

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アプリケーションを記述します方法ではありません、それはあなたの即時の問題が離れて行くようしながら、それは完全に、または完全に正しい解決策ではありません。ダニエルのコメントを拡大して簡単に始められるように、新しいCocoaアプリケーションプロジェクトを作成してください。 (あなたのために作成された)アプリケーションデリゲートクラスを開き、コードを-applicationDidFinishLaunching:メソッドに入れてください。その名前が示すように、そのメソッドはアプリケーションの起動が完了した後に呼び出され、AppKitクラスを通常どおり使用できるようにすべての設定が行われます。より多くの経験を積むと、典型的なCocoaアプリケーションのアーキテクチャをよく理解し、ユーザーインターフェイスなどを作成することができます。

+2

これは適切な道ですが、単にトップレベルのNSApplicationを確立するだけでは不十分です。アプリケーションのメインスレッド実行ループを実行して、正常に動作するようにする必要があります。いずれにしても、「この仕事をする」努力は間違ったものです。質問者は、実験のためのアプリケーションデリゲートクラスに焦点を当て、Xcodeの基本的な新しい "ココアアプリケーション"テンプレートから学習に近づいているはずです。 – danielpunkass

+0

これは完全な解決策ではないようですが、少なくとも私のマシン(10.7.3)ではこの単純なケースで実際に動作します。それは、@bbumとdanielpunkassは、私が経験した知識よりも経験が豊富で、彼らが何を話しているのか知っています。 –

+0

私は完全に同意します。私には、これがうまくいくのは面白いですが、実際には、実際のアプリケーションでこれを使用することはありません。私はより多くの私の答えを編集しました。 –

関連する問題