我正在为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
;它提供了必要的类ScreenSaverView
和ScreenSaverDefaults
。
您说您已经有一个名为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 Owner
是My_ScreensaverView
的实例。您可以通过选择该对象的图标,然后使用身份检查器指定类来确定。在
configSheet
socket 和面板之间建立连接。一种方法是在按住Ctrl键的同时从File's Owner
对象拖动到窗口或面板图标,然后从出现的弹出窗口中选择configSheet
。一如既往,祝您工作顺利。