我在代理应用程序中使用了NSMenu(没有停靠栏中的图标)。点击此菜单中的按钮时,我想显示一个通用的NSWindowController。
我的菜单按钮操作:
- (IBAction)menuButtonTapped:(id)sender {
MyWindowController *myWindow = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowController"];
[myWindow showWindow:nil];
[[myWindow window] makeMainWindow];
}
但是窗口只是在屏幕上“闪烁”(它显示并且消失得非常快)。
任何解决方案?
答案 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];