Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 是否可以在nib中使用带有ScreenSaverDefaults的绑定?_Macos_Interface Builder_Cocoa Bindings_Screensaver - Fatal编程技术网

Macos 是否可以在nib中使用带有ScreenSaverDefaults的绑定?

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

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

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

(可能重要的注释:我仍在用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")