可以在nib中使用绑定与ScreenSaverDefaults吗?

问题描述 投票:3回答:2

我正在做一个屏幕保护程序,所以我应该使用ScreenSaverDefaults而不是NSUserDefaults。 我想让我的configure面板为它的用户界面使用绑定,但它们需要连接到ScreenSaverDefaults,我看不到有什么方法可以做到这一点;IB(xCode)中唯一可用的默认控制器是标准的用户默认控制器。 有什么变通的办法吗,还是说在屏幕保护程序的上下文中无法使用nib中的绑定?

macos interface-builder cocoa-bindings screensaver
2个回答
3
投票

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

(可能的重要说明:我仍然在10.6上开发,使用XC 3.2.6;这段代码到目前为止只在10.10上进行了简单的测试(但似乎确实有效)。 另外,我混合使用了C++和Objective-C,所以在下面的内容中,你可能需要做一些小的代码清理。)

我的代码创建了一个自定义的用户默认控制器,并且UI绑定到了这个控制器上(控件绑定到File's Owner,而File's Owner设置为我的屏幕保护程序视图,控制器键为空,模型键路径为self.defaultsController.values.key_val,其中key_val是defaults plist中用来访问绑定到控件的值的任何键)。

你还必须创建你自己的屏幕保护程序默认值,并指导你的自定义用户默认控制器使用它们。早期 在屏幕保护程序初始化中(比如在屏幕保护程序视图的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;
    }

如果你想在屏幕保护程序中提供 "出厂重置 "功能,你需要在创建自定义用户默认控制器时,将初始值:参数设置为 "原始出厂值 "字典。 在响应 "重置为出厂默认值 "按钮时,只需向控制器发送revertToInitialValues:即可。

最后,请注意,根据上述代码中创建的一些对象的预期寿命,您可能需要保留其中的一些对象(并在以后适当释放它们)。 我假设你明白这个bhaller,我只是为广大读者指出这一点。


0
投票

Swift版本。

首先,注册默认的datas。

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")
© www.soinside.com 2019 - 2024. All rights reserved.