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

Jac*_*lyn 5 macos objective-c screensaver osx-mountain-lion

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

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

- (BOOL)hasConfigureSheet
{
    return NO;
}

- (NSWindow*)configureSheet
{
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

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

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


编辑:

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

Ext*_*ire 5

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

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

还有几件事:

您应该在项目中包含一个包含配置表UI的xib文件,并且您应该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'
Run Code Online (Sandbox Code Playgroud)

编辑:

如果我要告诉你已经知道的事情,请提前道歉,但你确实说过你遇到了困难configSheet,所以我只是覆盖了所有的基础.

My_ScreensaverView.h,宣布您的小组的出口:

IBOutlet id configSheet;
Run Code Online (Sandbox Code Playgroud)

请注意,我使用的是id代替NSWindow *或者NSPanel *,因为我不知道您实际使用的是哪个类.(理想情况下,NSPanel应该用于表格.)

在您的nib文件中,确保它File's Owner是一个实例My_ScreensaverView.您可以通过选择此对象的图标然后使用"标识"检查器指定类来确定此问题.

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

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