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

Cra*_*tis 7 xcode cocoa objective-c nspanel

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

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

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

第一个截图

说是在Interface Builder中做出更改取消选中"标题栏"复选框.然后我保存并重新运行,这就是你在第二个屏幕截图中看到的内容.虽然出现轻微阴影,但面板却没有.

在此输入图像描述

我试过的事情:

  • 我子类的NSPanel并返回YEScanBecomeKeyWindowcanBecomeMainWindow一些调查后,但(前子类)都返回这些方法NO无论我是否使用了标题栏或不是.所以我认为这不是问题所在.

  • 我确保NSPanel的框架设置正确.它有一个很好的高度,原点也设置正确.

编辑:忘记提及:

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

信息列表

sud*_*-rf 4

我过去曾遇到过这个问题。我首先“忽略”其他应用程序,然后将其设为关键窗口,从而解决了这个问题。尝试一下,看看它是否适合您。

[NSApp activateIgnoringOtherApps:YES];
[[self window]makeKeyAndOrderFront:self];
Run Code Online (Sandbox Code Playgroud)

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

[[self window]setLevel:NSPopUpMenuWindowLevel];
Run Code Online (Sandbox Code Playgroud)

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

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

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