Macos 是否可以在nib中使用带有ScreenSaverDefaults的绑定?
我正在开发一个屏幕保护程序,所以我应该使用ScreenSaverDefaults而不是NSUserDefaults。我想让我的配置面板为它的UI使用绑定,但它们需要连接到ScreenSaverDefaults,我看不到一种方法来做到这一点;IB(xCode)中唯一可用的默认控制器是标准用户默认控制器。是否有解决方法,或者只是不可能在屏幕保护程序的上下文中使用nib中的绑定?我已经成功地在屏幕保护程序中使用了绑定Macos 是否可以在nib中使用带有ScreenSaverDefaults的绑定?,macos,interface-builder,cocoa-bindings,screensaver,Macos,Interface Builder,Cocoa Bindings,Screensaver,我正在开发一个屏幕保护程序,所以我应该使用ScreenSaverDefaults而不是NSUserDefaults。我想让我的配置面板为它的UI使用绑定,但它们需要连接到ScreenSaverDefaults,我看不到一种方法来做到这一点;IB(xCode)中唯一可用的默认控制器是标准用户默认控制器。是否有解决方法,或者只是不可能在屏幕保护程序的上下文中使用nib中的绑定?我已经成功地在屏幕保护程序中使用了绑定 (可能重要的注释:我仍在用XC3.2.6开发10.6);到目前为止,这个代码只在10
(可能重要的注释:我仍在用XC3.2.6开发10.6);到目前为止,这个代码只在10.10上被轻轻测试过(但似乎确实有效)。此外,我还将C++和ObjuleC混合,因此您可以在下面进行小代码清理。 我的代码创建并绑定到自定义用户默认控制器(控件绑定到文件的所有者,该所有者设置为“我的屏幕保护程序”视图,控制器键为空,模型键路径为self.defaultsController.values.key_val,其中key_val是默认列表中用于访问绑定到控件的值的任何键)
您还必须创建自己的屏幕保护程序默认值,并在屏幕保护程序初始化的早期(例如在屏幕保护程序视图的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];
如果希望在屏幕保护程序中提供“工厂重置”功能,则在创建自定义用户默认控制器时,需要将initialValues:参数设置为“原始工厂值”字典。响应“重置为出厂默认值”按钮,只需向控制器发送revertToInitialValues:即可
最后,请注意,根据在上述代码中创建的某些对象的预期寿命,您可能需要保留其中一些对象(并在以后适当地释放它们)。我想你了解这个巴勒;我只是向普通观众指出这一点。Swift版本:
首先,注册默认数据
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")
@stevesliva,ScreenSaverDefaults子类是由苹果的屏保框架提供的,它不是程序员创建的子类。它提供了一个新方法,+defaultsForModuleWithName:,用于定位存储模块的用户默认值的位置。在nib中使用NSUserDefaultsController根本不起作用;它不知道默认设置的位置。(我认为它会尝试将它们存储在系统首选项的默认文件中,这是错误的。)事实上,正如苹果的文档所表明的,你确实需要使用ScreenSaverDefaults。啊哈,谢谢。应该在这里搜索而不是谷歌。。。我已经习惯了结果是一样的。(删除了我的评论,你的评论现在为问题添加了很多背景。)问题+1。
let defaults = ScreenSaverDefaults.init(forModuleWithName: "com.your.xxxx" ?? "")!
let userClockIndex = defaults.bool(forKey: "isShowSecond")