0

Objective C++ を使用して 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] ボタンとエラー用の a を備えた 1 つのウィンドウがあります。ペン先にNSTextViewa を設定し、それをウィンドウに接続しました。NSWindowController

私の唯一のリンクは、ほとんどの例がこれを示しているということ[errorWindowControl showWindow: self]です。ではなく、showWindow: nilこれは C++ コンストラクターであるため、私は持ってselfおらthisず、機能しません。

重要な場合、このコンストラクターはのプライマリのawakeFromNibメソッドから呼び出されます。MainMenu.nibNSObject

ありがとう

4

1 に答える 1

3

Cocoa へのちょっと変わったアプローチです。一歩下がって、Objective-C を学び、バッキング ストアやモデル レイヤーの上に Objective-C ベースの Cocoa UI レイヤーを使用してアプリケーションを作成することをお勧めします。

いずれにせよ、そのコードには特に問題はありません (奇妙な設計を除けば)。

最初に確認することは、-initWithWindowNibName: の戻り値です。errorWindowControl は実際には非 nil ですか? nil の場合、NIB はロードに失敗しました。

Cocoa アプリケーション自体はどのように作成していますか? Xcode を使用した標準アプリ バンドルでしょうか。

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

于 2009-08-30T19:07:41.670 に答える