我正在为 OSX (Mountain Lion) 开发屏幕保护程序,但在设置配置表时遇到了问题(因此当用户在系统偏好设置中单击“屏幕保护程序选项...”时,我的选项就会出现) .在 Internet 上的任何地方似乎只有两三个关于编写 OSX 屏幕保护程序的教程,而且它们都是几年前的,所以这些 Material 不能完全转换为 OSX 10.8 和 Xcode 4。
首先,在我的 ScreenSaverView.m
文件中,我有:
- (BOOL)hasConfigureSheet
{
return NO;
}
- (NSWindow*)configureSheet
{
return nil;
}
...然而,在“系统偏好设置”中,“屏幕保护程序选项...”按钮仍然可以点击(点击时没有任何反应),而不是像“Arabesque”屏幕保护程序那样被禁用。
单击按钮时显示配置表的步骤是什么?为什么当前未禁用该按钮?
编辑:
我意识到为什么“屏幕保护程序选项...”按钮没有被禁用。我忘了在 ScreenSaverView.h
文件中包含 -(BOOL)hasConfigureSheet;
。然而,关于如何让配置表出现的问题仍然存在。
最佳答案
首先要做的事情:确保在您的项目中包含ScreenSaver.framework
;它提供了必要的类 ScreenSaverView
和 ScreenSaverDefaults
。
您说您已经有一个名为 ScreenSaverView.m
的文件。再加上你还说你必须导出你的 -hasConfigureSheet
方法才能使“屏幕保护程序选项...”按钮禁用。这让我想知道您是否像您应该做的那样对 ScreenSaverView
进行了子类化。 (您是否将 NSObject
改为子类?) ScreenSaverView
为您导出诸如 -hasConfigureSheet
的方法。您应该对其进行子类化,并覆盖其中的适当方法。
还有一些事情:
您应该在您的项目中包含一个包含配置表 UI 的 xib 文件,并且您应该在子类的界面中提供 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 和面板之间建立连接。一种方法是按住 Control 键,同时从 File's Owner
对象拖动到窗口或面板图标,然后从出现的弹出窗口中选择 configSheet
.
一如既往,祝你工作顺利。
关于objective-c - 如何设置 OSX 屏幕保护程序配置表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13572627/