chenluois
2011-11-21 10:57:26 +08:00
居然没有人回答,那么我来答好了。
你的第一个问题:
首先,在你的 PreferenceController.m 的 init 里这样写
- (id)init
{
if (![super initWithWindowNibName:@"Preference"]) {
return nil;
}
return self;
}
其次,执行 action 显示窗口的时候就不要再用 initWithWindowNibName 了
if (!preferenceController) {
preferenceController = [[PreferenceController alloc] init];
}
[preferenceController showWindow:self];
最后,别忘了把 Preference.xib 的 File's Owner 的 Class 设置为 PreferenceController
这样设置下来,你的第二个问题也应该解决了。
再说你的第三个疑问:
为什么把 NSPanel 的 style 设为 Utility Panel 就可以让这个窗口一直显示在前台。这实际上就相当于加了一个 NSFloatingWindowLevel 的属性。
Level 这个概念有点儿类似图层,不同种类的窗口在不同的层上。一般窗口处于 NSNormalWindowLevel。NSFloatingWindowLevel 在 NSNormalWindowLevel 的上层。Dock 栏处于 NSDockWindowLevel,又在 NSFloatingWindowLevel 的上层。
一共有10个不同的层级:
NSNormalWindowLevel
NSFloatingWindowLevel
NSSubmenuWindowLevel
NSTornOffMenuWindowLevel
NSMainMenuWindowLevel
NSStatusWindowLevel
NSModalPanelWindowLevel
NSPopUpMenuWindowLevel
NSScreenSaverWindowLevel
NSDockWindowLevel
不设置 style 一样可以达到这样的效果,对任意一种类型的窗口应用 setLevel 方法即可,如:
[window setLevel:NSFloatingWindowLevel];