Cocoa屏幕保护程序配置面板自由浮动

时间:2012-02-04 11:19:29

标签: cocoa screensaver

我正在使用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;
}

在新安装保护程序后,单击“选项”使配置页不显示为工作表,而是在屏幕上自由浮动,没有边框。否则,它会正常工作,并在被解雇后消失。

当我再次单击“选项”时,配置工作表再次出现,这次正确显示为首选项窗口的工作表。然后立即冻结,以便我无法点击任何控件。

有没有人知道造成这种行为的原因是什么?

2 个答案:

答案 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。