4

エージェント アプリケーションで NSMenu を使用しています(ドックにアイコンがありません)。このメニューのボタンがタップされたときに、汎用の NSWindowController を表示したいと考えています。

私のメニューボタンのアクション:

- (IBAction)menuButtonTapped:(id)sender {    
    MyWindowController *myWindow = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowController"];

    [myWindow showWindow:nil];
    [[myWindow window] makeMainWindow];
}

ただし、ウィンドウは画面内で「点滅」するだけです (非常に速く表示および非表示になります)。

解決策はありますか?

4

2 に答える 2

9

ウィンドウが一瞬表示されてから消える理由は、ARC とウィンドウ コントローラーのインスタンスの作成方法に関係しています。

- (IBAction)menuButtonTapped:(id)sender {    
    MyWindowController *myWindow = [[MyWindowController alloc]
                    initWithWindowNibName:@"MyWindowController"];
    [myWindow showWindow:nil];
    [[myWindow window] makeMainWindow];
}

ARC では、myWindowインスタンスはそれが定義されている範囲で有効になります。つまり、最後の[[myWindow window] makeMainWindow];行に到達して実行した後、ウィンドウ コントローラーが解放されて割り当てが解除され、その結果、そのウィンドウが画面から削除されます。

一般的に言えば、作成したアイテムまたはオブジェクトを「固定」したい場合は、それらをstrongプロパティを持つインスタンス変数として定義する必要があります。

たとえば、.h は次のようになります。

@class MyWindowController;

@interface MDAppController : NSObject

@property (nonatomic, strong) MyWindowController *windowController;

@end

そして、修正されたmenuButtonTapped:メソッドは次のようになります。

- (IBAction)menuButtonTapped:(id)sender {
    if (self.windowController == nil) {
         self.windowController = [[MyWindowController alloc]
            initWithWindowNibName:@"MyWindowController"];
    }
    [self.windowController showWindow:nil];
}
于 2012-11-18T17:35:56.463 に答える
0

これを使って:

[[myWindow window] makeKeyAndOrderFront:self];
于 2012-11-18T15:59:18.710 に答える