gpt4 book ai didi

cocoa - 从 NSMenu 打开 NSWindowController

转载 作者:行者123 更新时间:2023-12-03 16:12:40 26 4
gpt4 key购买 nike

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

我的菜单按钮操作:

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

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

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

有什么解决办法吗?

最佳答案

窗口出现一瞬间然后消失的原因与 ARC 以及如何创建窗口 Controller 实例有关:

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

在 ARC 下,myWindow 实例在定义它的范围内有效。换句话说,在到达并运行最后一个 [[myWindow window] makeMainWindow]; 行后,窗口 Controller 将被释放并取消分配,结果,其窗口将从屏幕上删除.

一般来说,对于您创建的想要“保留”的项目或对象,您应该将它们定义为具有 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];
}

关于cocoa - 从 NSMenu 打开 NSWindowController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13441718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com