首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从NSWindowController打开NSMenu

从NSWindowController打开NSMenu
EN

Stack Overflow用户
提问于 2012-11-18 15:51:17
回答 2查看 2.8K关注 0票数 4

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

我的菜单按钮动作:

代码语言:javascript
复制
- (IBAction)menuButtonTapped:(id)sender {    
    MyWindowController *myWindow = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowController"];

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

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

有解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-18 17:35:56

窗口突然出现然后消失的原因与ARC和如何创建窗口控制器实例有关:

代码语言:javascript
复制
- (IBAction)menuButtonTapped:(id)sender {    
    MyWindowController *myWindow = [[MyWindowController alloc]
                    initWithWindowNibName:@"MyWindowController"];
    [myWindow showWindow:nil];
    [[myWindow window] makeMainWindow];
}

在ARC下,myWindow实例对于定义它的作用域是有效的。换句话说,在到达并运行最后一个[[myWindow window] makeMainWindow];行之后,窗口控制器将被释放并解除分配,因此它的窗口将从屏幕上删除。

一般来说,对于要“逗留”的项或对象,应该将它们定义为具有strong属性的实例变量。

例如,您的.h应该如下所示:

代码语言:javascript
复制
@class MyWindowController;

@interface MDAppController : NSObject

@property (nonatomic, strong) MyWindowController *windowController;

@end

修改后的menuButtonTapped:方法如下所示:

代码语言:javascript
复制
- (IBAction)menuButtonTapped:(id)sender {
    if (self.windowController == nil) {
         self.windowController = [[MyWindowController alloc]
            initWithWindowNibName:@"MyWindowController"];
    }
    [self.windowController showWindow:nil];
}
票数 9
EN

Stack Overflow用户

发布于 2012-11-18 15:59:18

用这个:

代码语言:javascript
复制
[[myWindow window] makeKeyAndOrderFront:self];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13441718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档