我正在为OSX(Mountain Lion)制作屏幕保护程序,我在设置配置表时遇到问题(因此,当用户点击“系统偏好设置”中的“屏幕保护程序选项...”时,会显示我的选项) 。在互联网上的任何地方编写OSX屏幕保护程序似乎只有两三个教程,而且它们都已经存在了几年,因此这些材料并没有完全转化为OSX 10.8和Xcode 4。
首先,在我的ScreenSaverView.m
文件中,我有:
- (BOOL)hasConfigureSheet
{
return NO;
}
- (NSWindow*)configureSheet
{
return nil;
}
...然而,在“系统偏好设置”中,“屏幕保护程序选项...”按钮仍然可以点击(单击时没有任何反应),而不是像“Arabesque”屏幕保护程序中那样禁用。
单击按钮时显示配置页的步骤是什么,为什么当前没有禁用该按钮?
修改
我意识到为什么没有禁用“屏幕保护程序选项...”按钮。我忘了在-(BOOL)hasConfigureSheet;
文件中加入ScreenSaverView.h
。然而,关于如何使配置表出现的问题仍然存在。
答案 0 :(得分:5)
首先要做的事情:确保在项目中加入ScreenSaver.framework
;它提供了必要的课程ScreenSaverView
和ScreenSaverDefaults
。
您说您已经有一个名为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 Owner
是My_ScreensaverView
的实例。您可以通过选择此对象的图标然后使用“标识”检查器指定类来确定这一点。
在configSheet
插座和面板之间建立连接。一种方法是在从File's Owner
对象拖动到窗口或面板图标的同时按住Control键,然后从显示的弹出窗口中选择configSheet
。
一如既往,祝你工作顺利。