是否可以使用ScreenSaverDefaults在nib中使用绑定?

时间:2015-05-21 18:44:36

标签: macos interface-builder cocoa-bindings screensaver

我正在使用屏幕保护程序,因此我应该使用ScreenSaverDefaults而不是NSUserDefaults。我想让我的配置面板为其UI使用绑定,但是它们需要连接到ScreenSaverDefaults,我看不到这样做的方法; IB(xCode)中唯一可用的默认控制器是标准用户默认控制器。是否有解决方法,或者是否无法在屏幕保护程序的上下文中使用nib中的绑定?

2 个答案:

答案 0 :(得分:3)

我已成功在屏幕保护程序中使用绑定。

(可能很重要的说明:我仍然在10.6上开发,使用XC 3.2.6;这个代码到目前为止仅在10.10上进行了轻微测试(但似乎确实有效)。另外,我混合了C ++和Objective -C,因此您可能需要进行少量代码清理。)

我的代码创建,并且UI绑定到自定义用户默认控制器(控件绑定到File&#39的所有者,设置为我的屏幕保护程序视图,控制器键为空,模型键路径为self.defaultsController.values.key_val,其中key_val是默认plist中用于访问绑定到控件的值的任何键。)

您还必须创建自己的屏幕保护程序默认值,并指导您的自定义用户默认控制器在屏幕保护程序初始化中使用它们 early (例如在屏幕保护程序视图的initWithFrame:方法中) ,像这样:

// Find our bundle:
NSBundle * screenSaverBundle = [NSBundle bundleForClass: [self class]];

// Load per-user screen saver defaults:
ScreenSaverDefaults * screenSaverDefaults = [ScreenSaverDefaults defaultsForModuleWithName: [screenSaverBundle bundleIdentifier]];

// Create default defaults (values to use when no other values have been established):
NSDictionary * defaultDefaultValues = [self defaultDefaults];

// Register default defaults as fallback values (in registration domain):
[screenSaverDefaults registerDefaults: defaultDefaultValues];

// Configure custom user defaults controller to use the correct defaults:
// NOTE: defaultsController of NSUserDefaultsController * type *MUST* be declared using @property in your header, and accessors must be provided (typically using @synthesize in the implementation section).
defaultsController = [[NSUserDefaultsController alloc] initWithDefaults: screenSaverDefaults initialValues: nil];   // <- change nil to factory defaults, if desired

// Make sure changes are only saved when committed by user:
[defaultsController setAppliesImmediately: false];

(上面的代码在我自己的代码中稍微重新排列了各种方法;可能有一两个错字,但要点是正确的。)

defaultDefaults的实现看起来像这样(原谅我的非传统风格):

- (NSDictionary *) defaultDefaults
    {
    NSString * ResourcesPath = [[self screenSaverBundle] resourcePath];
    NSString * DefaultDefaultsPath = [ResourcesPath stringByAppendingPathComponent: @"DefaultDefaults.plist"];

    NSDictionary * DefaultDefaults = [NSDictionary dictionaryWithContentsOfFile: DefaultDefaultsPath];

    return DefaultDefaults;
    }

如果您想提供&#34;出厂重置&#34;在屏幕保护程序中,您需要将initialValues:参数设置为&#34;原始出厂值&#34;创建自定义用户默认控制器时的字典。响应&#34;重置为出厂默认值&#34;按钮,只需将revertToInitialValues:发送到控制器。

最后,请注意,根据上述代码中创建的某些对象的预期生命周期,您可能需要保留其中一些(并在以后正确释放它们)。我假设你理解这个bhaller;我只是为普通观众指出这一点。

答案 1 :(得分:0)

快速版本:

首先,注册默认数据。

let defaults = ScreenSaverDefaults.init(forModuleWithName: "com.your.xxxx" ?? "")!
defaults.register(defaults: ["isShowSecond":true,
                             "userThemeIndex":0,
                             "userClockIndex":0
])

您可以设置值:

defaults.set(false, forKey: "isShowSecond")

您可以获得价值:

let defaults = ScreenSaverDefaults.init(forModuleWithName: "com.your.xxxx" ?? "")!
let userClockIndex = defaults.bool(forKey: "isShowSecond")