objective-c - 在 Interface Builder 中未选中 "Title Bar"的 NSPanel 不会出现

标签 objective-c xcode cocoa nspanel

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

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

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

First screenshot

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

enter image description here

我尝试过的事情:

  • 经过一些研究,我已经将 NSPanel 子类化并为 canBecomeKeyWindowcanBecomeMainWindow 返回了 YES,但是(在子类化)这些方法都返回 NO 无论我是否使用标题栏。所以我不认为这是问题所在。

  • 我已确保正确设置 NSPanel 的框架。它的高度很好,原点也设置得很好。

编辑:忘记提及:

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

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/

相关文章:

cocoa - 调整窗口大小时按钮未对齐

objective-c - 更新从文本字段绑定(bind)的属性,无需按 Enter 键

objective-c - 在与他人共享代码之前编译一个 Objective C iOS 类

multithreading - Cocoa线程无法访问Cocoa API

ios - 没有一个有效的配置文件包含设备?

cocoa - BWToolkit 包含崩溃

iphone - 为 iphone HTTP API 添加自定义证书

ios - iOS-异步创建的数组仅返回一个对象

iphone - NSMutableData 的内存泄漏

ios - 核心数据按升序获取最后 20 条记录?