所以我认为我已经涵盖了我的基础,但显然我错过了一两个关键步骤。
我有一个在按下 NSStatusItem 时显示的 NSPanel (makeKeyAndOrderFront:
)。一切正常,但由于 NSPanel 显示标题栏,面板也是可拖动的。 (这是不希望的。)
第一个屏幕截图显示了在界面生成器中启用“标题栏”的面板,在外观类别中。 (抱歉模糊不清,目前一切仍处于锁定状态。)
在 Interface Builder 中所做的唯一更改是取消选中“标题栏”复选框。然后我保存并重新运行,这就是您在第二个屏幕截图中看到的。虽然会出现轻微的阴影,但面板不会。
我尝试过的事情:
经过一些研究,我已经将 NSPanel 子类化并为
canBecomeKeyWindow
和canBecomeMainWindow
返回了YES
,但是(在子类化)这些方法都返回NO
无论我是否使用标题栏。所以我不认为这是问题所在。我已确保正确设置 NSPanel 的框架。它的高度很好,原点也设置得很好。
编辑:忘记提及:
该应用程序是一个只有菜单栏的应用程序。在下面的屏幕截图中,请注意向 Info.plist
添加了一个附加条目以强制执行此操作。
最佳答案
我过去遇到过这方面的问题。我能够通过首先“忽略”其他应用程序然后将其设为关键窗口来解决它。试一试,看看它是否适合您。
[NSApp activateIgnoringOtherApps:YES];
[[self window]makeKeyAndOrderFront:self];
此外,尝试在初始化期间将窗口级别设置为 NSPopUpMenuWindowLevel
。
[[self window]setLevel:NSPopUpMenuWindowLevel];
我在 Mac OS X 上加载 nib 文件的方式也遇到了问题。它们是“延迟加载”的,这意味着它们只有在需要时才会被初始化。当您想要在窗口上设置细节时,这会导致问题,但您不能因为 awakeFromNib
由于惰性 nib 加载似乎没有被调用。要解决此问题,这就是我过去所做的。在您的委托(delegate)中(或您初始化窗口的任何地方),通过访问已初始化类的 window
属性将窗口启动:
wc = [[blah alloc]initWithWindowNibName:NSStringFromClass([blah class])];
(void)[wc window]; //just kicks the lazy nib loading into gear
通过这样做,您将强制 Nib 进行初始化。这样,当用户单击菜单栏图标时,nib 已经初始化,并且 awakeFromNib
已经被调用。
关于objective-c - 在 Interface Builder 中未选中 "Title Bar"的 NSPanel 不会出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7656067/