未出现在Interface Builder中未选中“标题栏”的NSPanel

时间:2011-10-05 02:22:52

标签: objective-c xcode cocoa nspanel

所以我认为我已经覆盖了我的基地,但显然我错过了一两个关键的一步。

当按下NSStatusItem时,我显示了一个NSPanel(makeKeyAndOrderFront:)。事情很有效,但是当NSPanel显示标题栏时,面板也可以拖动。 (这是不受欢迎的。)

第一个屏幕截图显示了Interface Builder中“外观”类别中启用了“标题栏”的面板。 (对不起,模糊不清,现在仍然处于锁定和关键状态。)

First screenshot

在Interface Builder中进行的更改是取消选中“标题栏”复选框。然后我保存并重新运行,这就是你在第二个屏幕截图中看到的内容。当出现轻微阴影时,面板不会。

enter image description here

我尝试过的事情:

  • 经过一些研究后,我已经将NSPanel子类化并返回YES canBecomeKeyWindowcanBecomeMainWindow,但是(在子类化之前)这些方法都返回{{1}无论我是否使用标题栏。所以我认为这不是问题所在。

  • 我确保正确设置了NSPanel的帧。它有一个很好的高度,原点也设置得很好。

编辑:忘记提及:

该应用程序是一个仅限菜单栏的应用程序。在下面的屏幕截图中,请注意已向NO添加了一个附加条目以强制执行此操作。

Info Plist

2 个答案:

答案 0 :(得分:4)

我过去遇到过这个问题。我能够通过首先“忽略”其他应用程序来解决它,然后将其作为关键窗口。试一试,看看它是否适合你。

[NSApp activateIgnoringOtherApps:YES];
[[self window]makeKeyAndOrderFront:self];

另外,尝试在初始化期间将窗口级别设置为NSPopUpMenuWindowLevel

[[self window]setLevel:NSPopUpMenuWindowLevel];

我在Mac OS X上加载nib文件的方式也遇到了问题。它们“懒洋洋地”加载,这意味着它们在需要之前不会被初始化。当您想要在窗口上设置细节时,这会导致问题,但由于懒惰的笔尖加载,您似乎无法调用awakeFromNib。要解决这个问题,这就是我过去所做的。在您的委托中(或者在您初始化窗口的任何地方),通过访问初始化类的window属性来启动窗口:

wc = [[blah alloc]initWithWindowNibName:NSStringFromClass([blah class])];
(void)[wc window]; //just kicks the lazy nib loading into gear

通过这样做,你强迫nib初始化。这样,当用户点击菜单栏图标时,笔尖已经初始化,并且awakeFromNib已被调用。

答案 1 :(得分:1)

  

当出现轻微阴影时,面板不会。

你是说makeKeyAndOrderFront:在运行你的应用程序时,这个NSPanel对象上没有显示它?我刚创建了一个示例项目,NSButton触发了相同类型的NSPanel来显示,它工作正常.. titleBar是否启用。

http://cl.ly/3d0U3C0P3u2D0m3T1w1N