如何设置OSX屏幕保护程序配置表?

时间:2012-11-26 20:28:01

标签: objective-c macos osx-mountain-lion screensaver

我正在为OSX(Mountain Lion)制作屏幕保护程序,我在设置配置表时遇到问题(因此,当用户点击“系统偏好设置”中的“屏幕保护程序选项...”时,会显示我的选项) 。在互联网上的任何地方编写OSX屏幕保护程序似乎只有两三个教程,而且它们都已经存在了几年,因此这些材料并没有完全转化为OSX 10.8和Xcode 4。

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

- (BOOL)hasConfigureSheet
{
    return NO;
}

- (NSWindow*)configureSheet
{
    return nil;
}

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

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


修改

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

1 个答案:

答案 0 :(得分:5)

首先要做的事情:确保在项目中加入ScreenSaver.framework;它提供了必要的课程ScreenSaverViewScreenSaverDefaults

您说您已经有一个名为ScreenSaverView.m的文件。结合您还说您必须导出-hasConfigureSheet方法才能使“屏幕保护程序选项...”按钮禁用。这让我想知道你是否已经完成了ScreenSaverView的子类化。 (您是否继承了NSObject的子类?)ScreenSaverView为您导出-hasConfigureSheet等方法。您应该对其进行子类化,并覆盖其中的相应方法。

还有一些事情:

您应该在项目中包含一个xib文件,其中包含配置表的UI,您应该在子类的界面中提供IBOutlet来引用面板及其包含的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 *NSPanel *,原因很简单,因为我不知道您实际使用的是哪个类。 (理想情况下,NSPanel应该用于表格。)

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

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

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