4

我在代理应用程序中使用 NSMenu (在 Dock 中没有图标)。当点击此菜单中的按钮时,我想显示一个通用的 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 回答