我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
新安装保护程序后,单击"选项"使配置页不显示为工作表,而是在屏幕上自由浮动,没有边框.否则,它会正常工作并在被解雇后消失.
当我再次单击"选项"时,配置页再次出现,这次正确显示为首选项窗口的一页.然后立即冻结,以便我无法点击任何控件.
有谁知道导致这种行为的原因是什么?
小智 7
我和你今天遇到了同样的问题,我花了很长时间才把这个问题拿出来,所以这是我的解决方案:
我发现NSWindow
你一打电话就会出现loadNibNamed:owner:
.所以必须有某种机制来从笔尖自动打开窗口.
所以我重新检查了nib,发现"Visible At Launch"
在属性检查器窗格中有一个调用选项,默认情况下会选中该选项.
解决方案非常简单:只需取消选中该复选框即可按预期工作.
我发现它很容易被忽视,因为你希望窗口打开,但实际上它会打开两次(一次是自动打开,第二次是因为System Preferences.app将它显示为一张纸),这会导致故障.
可能发生的另一个问题,取决于您在类上定义ivar/property的方式是在第一次关闭并重新打开窗口之后它会冻结.这是因为默认情况下,窗口在关闭时会自行释放.
因此,请务必"Release When Closed"
在界面构建器中取消选中.