从NSMenu打开NSWindowController

时间:2012-11-18 15:51:18

标签: cocoa nswindow nswindowcontroller

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

我的菜单按钮操作:

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

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

但是窗口只是在屏幕上“闪烁”(它显示并且消失得非常快)。

任何解决方案?

2 个答案:

答案 0 :(得分:8)

窗口显示一瞬间然后消失的原因与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];
}

答案 1 :(得分:0)

使用此:

[[myWindow window] makeKeyAndOrderFront:self];