objective-c – 未出现在Interface Builder中未选中“标题栏”的NSPanel

所以我以为我已经覆盖了我的基地,但显然我错过了关键的一两步.

当按下NSStatusItem时,我显示了一个NSPanel(makeKeyAndOrderFront :).事情很有效,但是当NSPanel显示标题栏时,面板也可以拖动. (这是不受欢迎的.)

第一个屏幕截图显示了Interface Builder中“外观”类别中启用了“标题栏”的面板. (对不起,模糊不清,现在仍然处于锁定和关键状态.)

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

我尝试过的事情:

>我已经对NSPanel进行了子类化,并在经过一些研究后为canBecomeKeyWindow和canBecomeMainWindow返回YES,但是(在子类化之前)这些方法都返回NO,无论我是否使用标题栏.所以我认为这不是问题所在.
>我已确保正确设置NSPanel的帧.它有一个很好的高度,原点也设置正确.

编辑:忘记提及:

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

解决方法

我过去遇到过这个问题.我能够通过首先“忽略”其他应用程序来解决它,然后将其作为关键窗口.试一试,看看它是否适合你.
[NSApp activateIgnoringOtherApps:YES];
[[self window]makeKeyAndOrderFront:self];

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

[[self window]setLevel:NSPopUpMenuWindowLevel];

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

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

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

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...