从NSMenu打开NSWindowController

4

我是一个代理应用程序中的NSMenu,(没有在dock中显示图标)。当这个菜单中的按钮被点击时,我想显示一个通用的NSWindowController。

我的菜单按钮动作:

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

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

但是窗口在屏幕上只是"闪烁"(显示然后迅速消失)。

有什么解决方案吗?


你的项目使用自动引用计数(ARC)吗? - NSGod
@NSGod 是的,我的项目使用 ARC。 - user1795822
2个回答

9
窗口出现一瞬间然后消失的原因与 ARC 以及创建窗口控制器实例的方式有关:
- (IBAction)menuButtonTapped:(id)sender {    
    MyWindowController *myWindow = [[MyWindowController alloc]
                    initWithWindowNibName:@"MyWindowController"];
    [myWindow showWindow:nil];
    [[myWindow window] makeMainWindow];
}

在自动引用计数 (ARC) 下,myWindow 实例将在其定义范围内有效。换句话说,在达到并运行最后一行 [[myWindow window] makeMainWindow]; 之后,窗口控制器将被释放和销毁,结果,它的窗口将从屏幕中移除。
一般而言,对于您想要“留下来”的项目或对象,应将它们定义为具有强属性的实例变量。
例如,您的 .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];
}

哇!我不知道以前为什么没有意识到。谢谢,NSGod! :) - user1795822
我喜欢你的回答,对于 Mac OS X 开发新手来说非常有帮助。 - Nitin Gohel

0
使用这个:
[[myWindow window] makeKeyAndOrderFront:self];

不。我认为窗口没有显示是因为我的应用程序是代理(没有Dock图标),而且我没有主窗口(如Cocoa的主模板)。 - user1795822
据我所知,这没有什么区别。尝试调整窗口的“启动时可见”选项。如果这不起作用,那么MyWindowController中是否有任何可能干扰的内容呢? - Rengers
更改“主 nib 文件基本名称”会正常打开窗口控制器。取消选择/选择“启动时可见”不会影响任何内容。 - user1795822

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接