4

このアプリケーションには、AppController、Profile、ProfileBuilderの3つのクラスがあります。また、クラスごとに1つずつ、合計3つのウィンドウが必要です。3つすべてをNSObjectのサブクラスとして保持し、initWithNibNameをNSWindowControllerクラスのWindowController変数に適用しようとしましたが、各ウィンドウにいくつかの値を出力しようとすると機能せず、NSLogを使用するとウィンドウがnullになりました。複数のウィンドウを管理するための最良の方法は何でしょうか。おそらく、他のクラスにできるだけ特定のコードを含まないAppWindowsControllerのような同じクラスからのものであり、可能であれば、他のクラスをNSWindowControllerではなくNSObjectのサブクラスとして保持します。 。したがって、ウィンドウの動作をリモートで制御し、特定のクラス内に可能な限りコードを追加する方法がある場合は、それらを可能な限り明確に保ち、​​それらのコンテンツに独自に焦点を合わせるためだけに。おかげで、私が自分自身を明確にしたことを願っています、私は実際にはCocoaフレームワークにかなり慣れていません。

4

2 に答える 2

6

さまざまなクラスの init メソッドで、ウィンドウに nib ファイルをロードできるはずです。たとえば、プロファイルでは、次のようなことができます。

-(id)init {
    if (self = [super init]) {
        NSArray *array;
        BOOL success = [[NSBundle mainBundle] loadNibNamed:@"ProfileWindow" owner: self topLevelObjects:&array];
        if (success) {
            for (id obj in array) {
                if ([obj isKindOfClass:[NSWindow class]]) {
                    self.profileWindow = obj;
                }
            }
            [self.profileWindow makeKeyAndOrderFront:self];
        }
    }
    return self;
}

profileWindow はプロパティです (strong と入力)。xib ファイルで、ファイルの所有者をプロファイルに設定しました。

于 2012-09-28T04:04:25.250 に答える
2

rdelmar のソリューションを改善したいだけです。

NSWindowクラスを見つけるために配列を反復処理する必要はありません。profileWindow をアウトレットとして定義し、IB で接続すると、呼び出し

[[NSBundle mainBundle] loadNibNamed:@"ProfileWindow" owner:self topLevelObjects:&array];

ウィンドウオブジェクトをアウトレットに割り当てます。配列は必要ありません。ここで重要なのは、インターフェースとして機能する所有者オブジェクトです。IB では、所有者のクラス タイプを定義できます。そうであれば、そのアウトレットを参照してください。

于 2012-12-23T16:17:28.273 に答える