7

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

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

第一个屏幕截图显示了在界面生成器中启用了“标题栏”的面板,位于外观类别中。(抱歉模糊,事情目前仍处于锁定状态。)

第一张截图

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

在此处输入图像描述

我尝试过的事情:

  • 我已经对 NSPanelYES进行了子类化,canBecomeKeyWindowcanBecomeMainWindow在进行了一些研究之后返回,但是(在子类化之前)这些方法都返回NO了,无论我是否使用标题栏。所以我认为这不是问题。

  • 我已确保正确设置了 NSPanel 的框架。它具有良好的高度,并且原点设置也正确。

编辑:忘记提及:

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

信息清单

4

2 回答 2

4

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

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

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

[[self window]setLevel:NSPopUpMenuWindowLevel];

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

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

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

于 2011-10-08T19:49:04.877 回答
1

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

您是说 makeKeyAndOrderFront: on this NSPanel object 在运行您的应用程序时不显示它吗?我刚刚创建了一个示例项目,NSButton 触发了相同类型的 NSPanel 来显示,它工作正常.. titleBar 是否启用。

http://cl.ly/3d0U3C0P3u2D0m3T1w1N

于 2011-10-08T16:37:09.387 回答