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

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

我正在为 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;它提供了必要的类 ScreenSaverViewScreenSaverDefaults

您说您已经有一个名为 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 OwnerMy_ScreensaverView 的一个实例。您可以通过选择此对象的图标然后使用身份检查器指定类来确定这一点。

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

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

关于objective-c - 如何设置 OSX 屏幕保护程序配置表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13572627/

相关文章:

objective-c - 查找 Macintosh 文件的属性

ios - UITableViewCell 字体大小不变

python - Anaconda 运行时错误 : Python is not installed as a framework?

macos - 从启动服务中隐藏NSDocument子类

python - Brew 未安装最新版本

postgresql - 如何修复 pg_dump 版本不匹配错误?

c++ - SDL Video Init 在 Mac OS X 10.8 上导致异常

ios - 当应用程序被删除时,存储在 NSUserDefaults 中的值会发生什么变化?

iOS如何在屏幕外启动图像并将其动画化到屏幕上

node.js - 如何从 Node.js 设置终端选项卡标题?