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

Cocoa屏幕保护程序配置面板可自由浮动,cocoa,screensaver,Cocoa,Screensaver,我正在使用Cocoa的屏幕保护程序API编写一个屏幕保护程序。它是为64位arch编译的,我正在Lion上运行它 为了启用配置,我在主视图中添加了以下内容: - (BOOL)hasConfigureSheet { return YES; } - (NSWindow*)configureSheet { if (configureSheet == nil) { if (![NSBundle loadNibNamed: @"WTConfigureSheet" owne

我正在使用Cocoa的屏幕保护程序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;
}
新安装保护程序后,单击“选项”可使配置表不显示为表,而是在屏幕上自由浮动,没有边框。否则,它将正常工作,并在被解除后消失

当我第二次单击“选项”时,配置表再次出现,这次正确地显示为首选项窗口的一张表。然后它立即冻结,因此我无法单击它的任何控件


有人知道是什么导致了这种行为吗?

要使此代码按编写的方式工作,您需要在主视图的头文件中创建一个名为
configureSheet
的类型为
NSWindow*
的IBOutlet,保存该文件以便界面生成器可以看到更改,然后在Interface Builder中加载WTConfigureSheet.xib,并将顶级窗口组件连接到文件所有者->配置表。

我今天遇到了与您相同的问题,我花了很长时间才解决了这个问题,因此我的解决方案如下:

我发现只要您调用
loadNibNamed:owner:
,就会出现
NSWindow
。因此,必须有某种机制从NIB自动打开窗口

因此,我重新检查了nib,发现在默认选中的属性检查器窗格上有一个名为“启动时可见”的选项

解决方案非常简单:只需取消选中该复选框,它就会按预期工作

我发现它很容易被忽略,因为您希望窗口打开,但实际上它会打开两次(一次自动打开,第二次是因为System Preferences.app将其显示为一张工作表),这导致了故障

另一个可能发生的问题是,在第一次关闭并重新打开窗口后,它会冻结,这取决于您如何在类上定义ivar/属性。 这是因为默认情况下,窗口在关闭时会自动释放


因此,请务必取消选中interface builder中的“关闭时释放”。

谢谢。我一回到我的Mac电脑上就会试试这个!我已经检查了代码和xib,它是按照您建议的方式设置的;没什么可疑的。你刚刚解决了我的两个问题!当我清除“启动时可见”复选标记后,窗口正确连接;一旦我清除了“关闭时释放”按钮,冻结就消失了。当你思考这两个问题时,它们都是绝对有意义的,但首先你必须知道它们在那里。。。非常感谢。