2011-10-05 161 views
7

所以我认为我已经覆盖了我的基地,但显然我错过了一个或两个关键步骤。NSPanel未在界面生成器中选中“标题栏”

我有一个NSPanel显示(makeKeyAndOrderFront:),当NSStatusItem被按下时。事情很好,但由于NSPanel显示标题栏,面板也可以拖动。 (这是不希望的。)

第一个屏幕截图显示了在界面生成器中启用了“标题栏”的面板的外观类别中。 (很抱歉的模糊,事情仍然在锁和钥匙现在。)

First screenshot

变化是在Interface Builder提出的取消选中“标题栏”复选框。然后我保存并重新运行,这就是您在第二个屏幕截图中看到的内容。虽然出现轻微的阴影,但面板却没有。

enter image description here

事情我已经尝试:

  • 我子类的NSPanel和一些调查后canBecomeKeyWindowcanBecomeMainWindow返回YES,但(前子类),这些无论我是否使用标题栏,都返回NO。所以我不认为这是问题。

  • 我已经确保NSPanel的框架已正确设置。它有一个很好的高度,并且原点也设置得很好。

编辑:忘了提:

应用程序是一个菜单栏,唯一的应用程序。在下面的屏幕截图中,请注意,Info.plist中增加了一个条目来执行此操作。

Info Plist

回答

4

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

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

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

[[self window]setLevel:NSPopUpMenuWindowLevel]; 

我也有过与笔尖文件被加载在Mac OS X他们装“懒洋洋”的方式,这意味着,在需要他们之前,他们将不会被初始化的问题。当你想在窗口上设置细节时,这会产生问题,但是你不能,因为awakeFromNib似乎没有被调用,因为延迟的nib加载。为了解决这个问题,这是我过去所做的。在您的代理(或任何你初始化窗口),一脚把窗户变成行动通过访问初始化类window属性:

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

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

+0

不幸的是,这些解决方案似乎都没有帮助。 :( –

+0

你确定吗?你在哪里放置这个?你是否尝试同时使用它们?另外,我会在我的答案中加入一些东西。 –

+0

不,你知道吗,你是对的。但是我打算清除一些代码然后回来 –

1

虽然出现轻微的阴影,面板没有。

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

http://cl.ly/3d0U3C0P3u2D0m3T1w1N

+0

同意。似乎没有可能重现这一点,代码库中一定有其他的东西导致这种行为。 – jrturton

+0

我可能已经遗漏了一个关键的难题。在Info.plist文件中,应用程序还必须注册为代理。 (这是一个仅适用于菜单栏的应用程序,因此没有Dock图标是首选。)使用屏幕截图更新了问题。 –

相关问题