从NSMenu打开NSWindowController

4 cocoa nswindow nswindowcontroller

我在代理应用程序中使用NSMenu (在Dock中没有图标).点击此菜单中的按钮时,我想显示一个通用的NSWindowController.

我的菜单按钮动作:

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

    [myWindow showWindow:nil];
    [[myWindow window] makeMainWindow];
}
Run Code Online (Sandbox Code Playgroud)

但窗口只是在屏幕上"闪烁"(它显示并消失得非常快).

有解决方案吗

NSG*_*God 9

窗口显示一瞬间然后消失的原因与ARC有关,以及如何创建窗口控制器的实例:

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

在ARC下,myWindow实例将对定义它的范围有效.换句话说,在[[myWindow window] makeMainWindow];到达并运行最后一行之后,将释放并释放窗口控制器,结果,其窗口将从屏幕中移除.

一般来说,对于您想要"粘贴"的项目或对象,您应该将它们定义为具有strong属性的实例变量.

例如,你的.h看起来像这样:

@class MyWindowController;

@interface MDAppController : NSObject

@property (nonatomic, strong) MyWindowController *windowController;

@end
Run Code Online (Sandbox Code Playgroud)

修改后的menuButtonTapped:方法看起来像这样:

- (IBAction)menuButtonTapped:(id)sender {
    if (self.windowController == nil) {
         self.windowController = [[MyWindowController alloc]
            initWithWindowNibName:@"MyWindowController"];
    }
    [self.windowController showWindow:nil];
}
Run Code Online (Sandbox Code Playgroud)