7

我正在为 OSX(Mountain Lion)开发屏幕保护程序,但在设置配置表时遇到问题(因此,当用户在系统偏好设置中单击“屏幕保护程序选项...”时,会出现我的选项)。互联网上似乎只有两三个关于编写 OSX 屏幕保护程序的教程,而且它们都是几年前的,所以这些材料并不能完全转化为 OSX 10.8 和 Xcode 4。

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

- (BOOL)hasConfigureSheet
{
    return NO;
}

- (NSWindow*)configureSheet
{
    return nil;
}

...然而,在“系统偏好设置”中,“屏幕保护程序选项...”按钮仍然是可单击的(单击时没有任何反应),而不是像在“蔓藤花纹”屏幕保护程序中那样被禁用。

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


编辑:

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

4

1 回答 1

7

首先要做的事情:确保包含ScreenSaver.framework在您的项目中;它提供了必要的类ScreenSaverViewScreenSaverDefaults.

你说你已经有一个名为ScreenSaverView.m. 再加上您还说您必须导出您的-hasConfigureSheet方法才能禁用“屏幕保护程序选项...”按钮。这让我想知道你是否ScreenSaverView按照你应该做的那样进行了子类化。(您是否NSObject改为子类化?)为您ScreenSaverView导出方法-hasConfigureSheet。您应该继承它,并覆盖其中的适当方法。

还有几件事:

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

最后,您的 -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中,为您的面板声明一个出口:

IBOutlet id configSheet;

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

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

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

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

于 2012-12-05T01:01:18.310 回答