2009-08-30 7 views
0

Objective C++を使用してC++コンストラクタからNibをロードしようとしています。私はいくつかのコードを一緒に取得するのに十分なサンプルを検索して見つけましたが、ウィンドウは表示されません。またはその問題の窓。ここObjective C++でNibと表示ウィンドウをロードする

は、コンストラクタの例である:

JokeSystem::JokeSystem() : fileSystem("/Library/Application Support/Jokes/") 
{ 
    try 
    { 
     randSystem = new RandSelect<std::string> 
            (fileSystem.getAllFileContents("%\n")); 
    } 
    catch (std::ifstream::failure) 
    { 
     NSWindowController * errorWindowControl = [[NSWindowController alloc] 
             initWithWindowNibName:@"ErrorWindow"]; 
     [errorWindowControl showWindow: nil]; 
    } 
} 

コンストラクタの目的は、文字列にディレクトリの内容をロードすることです。私がやろうとしているのは、ファイルを開くことができないときにエラーウィンドウを表示することです。

ErrorWindow.nibには、エラーのOKボタンとNSTextViewを持つ単一のウィンドウがあります。このウィンドウにNSWindowControllerを設定してウィンドウに接続しました。

私の唯一のリンクは、ほとんどの例がこれを示していることです。[errorWindowControl showWindow: self]; showWindow: nilではなく ですが、これはC++のコンストラクタなので、私にはselfがなく、thisは機能しません。

このコンストラクタは、MainMenu.nibNSObjectawakeFromNibメソッドから呼び出されます。

おかげ

答えて

3

ココアにアプローチする方法奇数のビット。私はあなたに戻って、Objective-Cを学び、Objective-CベースのCocoa UIレイヤーを使って、あなたが持っているバッキングストアやモデルレイヤの上にアプリケーションを書くことをお勧めします。

いずれにしても、そのコードには特に問題はありません(奇妙なデザインではありません)。

最初にチェックするのは、-initWithWindowNibName:の戻り値です。 errorWindowControlは実際にはnilではありませんか?それがnilの場合、NIBはロードできませんでした。

あなたはどのようにCocoaアプリケーションを作成していますか? Xcodeを使用して標準のアプリケーションバンドル、私は願っていますか?

また、/ Library/Application Support /へのパスをハードコーディングしないでください。実際には、アプリケーションは唯一の格納場所としてそのディレクトリを使用すべきではありません。多くのユーザーはそのディレクトリへの書き込みアクセス権を持たず、管理者のアクセスなしではアプリケーションをインストールすることができません。

+0

私はerrorWindowControlをテストしましたが、それはゼロではありませんでした。プログラムにあるObjective-Cは、MainMenu.nibのフロントエンドであり、このクラスからC++関数を実行します。そのため、ここではウィンドウを作成しています。なぜなら、上記のコンストラクタはプログラムの開始時に使用され、ウィンドウを表示してプログラムを終了するからです。ディレクトリは〜/ Library/Application Supportですが、エラー処理をチェックするために間違ったディレクトリをロードするために使用しました。 Xcodeで標準のCocoaアプリバンドルを使用しています。ありがとう –

関連する問題