我正在使用Cocoa的ScreenSaver API编写屏幕保护程序。它是为64位arch编译的,我在Lion上运行它。
为了启用配置,我在主视图中添加了以下内容:
- (BOOL)hasConfigureSheet
{
return YES;
}
- (NSWindow*)configureSheet
{
if (configureSheet == nil) {
if (![NSBundle loadNibNamed: @"WTConfigureSheet" owner: self]) {
NSLog(@"Failed to load config sheet");
return nil;
}
}
ScreenSaverDefaults *defaults =
[ScreenSaverDefaults defaultsForModuleWithName: WTModuleName];
backgroundColorWell.color = [defaults objectForKey: @"BackgroundColor"];
lightLetterColorWell.color = [defaults objectForKey: @"LightLetterColor"];
darkLetterColorWell.color = [defaults objectForKey: @"DarkLetterColor"];
return configureSheet;
}
在新安装保护程序后,单击“选项”使配置页不显示为工作表,而是在屏幕上自由浮动,没有边框。否则,它会正常工作,并在被解雇后消失。
当我再次单击“选项”时,配置工作表再次出现,这次正确显示为首选项窗口的工作表。然后立即冻结,以便我无法点击任何控件。
有没有人知道造成这种行为的原因是什么?
答案 0 :(得分:7)
我遇到了和你今天一样的问题,我花了很长时间来解决这个问题,所以这是我的解决方案:
我发现只要您拨打NSWindow
,就会显示loadNibNamed:owner:
。所以必须有某种机制来自动打开笔尖的窗口。
所以我重新检查了笔尖,发现属性检查器窗格中有一个名为"Visible At Launch"
的选项,默认情况下会选中该选项。
解决方案非常简单:只需取消选中该复选框即可按预期工作。
我发现它很容易被忽视,因为你希望窗口打开,但实际上它会打开两次(一次是自动打开,第二次是因为System Preferences.app将它显示为一张纸),这会导致故障。
可能发生的另一个问题,取决于您在类上定义ivar / property的方式是在第一次关闭并重新打开窗口后它会冻结。 这是因为默认情况下,窗口在关闭时会自行释放。
因此,请务必取消选中界面构建器中的"Release When Closed"
。
答案 1 :(得分:1)
要使此代码按写入方式工作,您需要在主视图的头文件中创建一个名为NSWindow*
的{{1}}类型的IBOutlet,保存该文件,以便Interface Builder可以看到更改,然后加载Interface Builder中的WTConfigureSheet.xib并将顶层窗口组件连接到文件所有者 - > configureSheet。