从 NSMenu 打开 NSWindowController

2024-03-24

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

我的菜单按钮操作:

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

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

但窗口只是在屏幕上“闪烁”(它显示和消失的速度非常快)。

有什么解决办法吗?


窗口出现一瞬间然后消失的原因与 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];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 NSMenu 打开 NSWindowController 的相关文章

随机推荐