在界面生成器中未选中“标题栏”的 NSPanel 不会出现
Posted
技术标签:
【中文标题】在界面生成器中未选中“标题栏”的 NSPanel 不会出现【英文标题】:NSPanel with "Title Bar" unchecked in Interface Builder does not appear 【发布时间】:2011-10-05 02:22:52 【问题描述】:所以我以为我已经覆盖了我的基础,但显然我错过了一个或两个关键步骤。
当按下 NSStatusItem 时,我有一个显示的 NSPanel (makeKeyAndOrderFront:
)。效果很好,但是当 NSPanel 显示标题栏时,面板也是可拖动的。 (这是不希望的。)
第一个屏幕截图显示了在 Interface Builder 中的外观类别中启用了“标题栏”的面板。 (抱歉模糊,事情目前仍处于锁定状态。)
在 Interface Builder 中所做的唯一更改是取消选中“标题栏”复选框。然后我保存并重新运行,这就是您在第二个屏幕截图中看到的内容。虽然出现了轻微的阴影,但面板没有。
我尝试过的事情:
经过一番研究后,我对 NSPanel 进行了子类化,并为 canBecomeKeyWindow
和 canBecomeMainWindow
返回了 YES
,但是(在子类化之前)这些方法都返回了 NO
,无论我是否使用标题栏与否。所以我认为这不是问题。
我已确保正确设置了 NSPanel 的框架。它有一个很好的高度,并且原点设置也正确。
编辑:忘记提及:
该应用程序是一个仅限菜单栏的应用程序。在下面的屏幕截图中,请注意在 Info.plist
中添加了一个附加条目来强制执行此操作。
【问题讨论】:
【参考方案1】:我过去曾遇到过这个问题。我能够通过首先“忽略”其他应用程序,然后将其设置为关键窗口来解决它。试一试,看看它是否适合你。
[NSApp activateIgnoringOtherApps:YES];
[[self window]makeKeyAndOrderFront:self];
另外,尝试在初始化期间将窗口级别设置为NSPopUpMenuWindowLevel
。
[[self window]setLevel:NSPopUpMenuWindowLevel];
我在 Mac OS X 上加载 nib 文件的方式也遇到了问题。它们是“延迟”加载的,这意味着它们在需要之前不会被初始化。当您想在窗口上设置细节时,这会导致问题,但您不能因为 awakeFromNib
似乎没有被调用,因为延迟加载。为了解决这个问题,这是我过去所做的。在您的委托(或您初始化窗口的任何位置)中,通过访问已初始化类的 window
属性来启动窗口:
wc = [[blah alloc]initWithWindowNibName:NSStringFromClass([blah class])];
(void)[wc window]; //just kicks the lazy nib loading into gear
这样做会强制笔尖初始化。这样,当用户单击菜单栏图标时,笔尖已经初始化,并且 awakeFromNib
已经被调用。
【讨论】:
不幸的是,这些解决方案似乎都没有帮助。 :( 你确定吗?你把这个放在哪里?您是否尝试同时使用它们?另外,我会在我的答案中添加一些内容。 不,你知道吗,你是对的。还有一些其他代码干扰了这些更改。事情仍然有点不稳定,但我会清除一些代码并回来。 太棒了!如果您还有其他问题,请告诉我。 ;)【参考方案2】:虽然出现轻微的阴影,但面板没有。
你是说 makeKeyAndOrderFront: on this NSPanel object 在运行你的应用程序时不显示它吗?我刚刚创建了一个示例项目,NSButton 触发了相同类型的 NSPanel 来显示,它工作正常.. titleBar 是否启用。
http://cl.ly/3d0U3C0P3u2D0m3T1w1N
【讨论】:
同意。似乎无法重现这一点,代码库中一定有其他东西导致了这种行为。 我可能遗漏了拼图中的关键部分。在 Info.plist 文件中,应用程序还必须注册为代理。 (这是一个仅限菜单栏的应用程序,因此最好不要使用 Dock 图标。)使用屏幕截图更新问题。以上是关于在界面生成器中未选中“标题栏”的 NSPanel 不会出现的主要内容,如果未能解决你的问题,请参考以下文章