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

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

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

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

我尝试过的事情:

  • 经过一些研究,我对NSPanel进行了子类化,并为YEScanBecomeKeyWindow返回了canBecomeMainWindow,但是(在子类化之前)这些方法都返回了NO,无论我是否使用标题栏。所以我认为这不是问题。
  • 我已经确保正确设置了NSPanel的框架。它具有良好的高度,并且原点也已正确设置。

  • 编辑:忘记提及:

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

    最佳答案

    过去我对此有疑问。通过首先“忽略”其他应用程序,然后使其成为关键窗口,我能够解决它。试一试,看看它是否对您有用。

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

    另外,尝试在初始化期间将窗口级别设置为NSPopUpMenuWindowLevel
    [[self window]setLevel:NSPopUpMenuWindowLevel];
    

    我也遇到了在Mac OS X上加载nib文件的方式的问题。它们“懒惰地”加载,这意味着直到需要它们时才对其进行初始化。当您想在窗口上设置细节时,这会导致问题,但是由于延迟的笔尖加载,似乎无法调用awakeFromNib,因此您不能这样做。为了解决这个问题,这是我过去所做的。在您的委托(delegate)(或您初始化窗口的任何位置)中,通过访问已初始化类的window属性将窗口付诸实践:
    wc = [[blah alloc]initWithWindowNibName:NSStringFromClass([blah class])];
    (void)[wc window]; //just kicks the lazy nib loading into gear
    

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

    07-28 03:31
    查看更多