我正在为OSX(Mountain Lion)安装屏幕保护程序,但无法设置配置表(因此,当用户在“系统偏好设置”中单击“屏幕保护程序选项...”时,将出现我的选项)。在Internet上的任何地方编写OSX屏幕保护程序的教程似乎只有两到三个,而且它们都已经使用了好几年了,因此该 Material 并不能完全转换为OSX 10.8和Xcode 4。

首先,在我的ScreenSaverView.m文件中,我有:

- (BOOL)hasConfigureSheet
{
    return NO;
}

- (NSWindow*)configureSheet
{
    return nil;
}

...但是,在“系统偏好设置”中,“屏幕保护程序选项...”按钮仍然可以单击(单击时什么也没有发生),而不是像“阿拉伯式”屏幕保护程序那样被禁用。

单击该按钮时,显示配置表的步骤是什么,为什么当前未禁用该按钮?

编辑:

我意识到为什么未禁用“屏幕保护程序选项...”按钮。我忘了在-(BOOL)hasConfigureSheet;文件中包括ScreenSaverView.h。但是,关于如何使配置表出现的问题仍然存在。

最佳答案

首先,要确保项目中包括ScreenSaver.framework;它提供了必要的类ScreenSaverViewScreenSaverDefaults

您说您已经有一个名为ScreenSaverView.m的文件。再加上您还说您必须导出-hasConfigureSheet方法才能禁用“屏幕保护程序选项...”按钮。这使我想知道您是否已经按照您的要求对ScreenSaverView进行了子类化。 (您是不是NSObject的子类呢?)ScreenSaverView会为您导出-hasConfigureSheet之类的方法。您应该将其子类化,并覆盖其中的适当方法。

还有两件事:

您应该在您的项目中包含一个xib文件,其中包含配置表的UI,并且应该在子类的界面中提供IBOutlet,以引用面板及其包含的UI元素(实际上您需要一个 socket ) , 那是)。

最后,您的-configureSheet方法应以与此类似的方式获取配置表(在此示例中,configSheet将是您的IBOutlet之一):

if (configSheet == nil)
{
    if ([NSBundle loadNibNamed:@"myConfigSheet" owner:self] == NO)
    {
        NSLog(@"load config sheet failed");
    }
}

// then retrieve your defaults and set up your sheet; you should
//  be working with ScreenSaverDefaults, a subclass of NSUserDefaults.

// then return 'configSheet'

编辑:

如果我要告诉您您已经知道的事情,请提前道歉,但是您确实说过configSheet遇到了困难,因此,我只介绍了所有基础知识。

My_ScreensaverView.h中,为面板声明一个 socket :
IBOutlet id configSheet;

请注意,我之所以使用id而不是NSWindow *NSPanel *,仅仅是因为我不知道您实际上为工作表使用的是什么类。 (理想情况下,应将NSPanel用于图纸。)

在您的nib文件中,确保File's OwnerMy_ScreensaverView的实例。您可以通过选择该对象的图标,然后使用身份检查器指定类来确定。

configSheet socket 和面板之间建立连接。一种方法是在按住Ctrl键的同时从File's Owner对象拖动到窗口或面板图标,然后从出现的弹出窗口中选择configSheet

一如既往,祝您工作顺利。

10-08 05:53