我在我的应用程序中对 NSUserDefaults 进行子类化。这个的副作用是我不能使用 [NSUserDefaults sharedUserDefaults], ,我必须有一个类方法来提供我自己的静态默认对象。这在代码中不是问题,但事实证明,现在我正在将首选项 UI 与绑定连接起来,这很棘手。

共享的 NSUserDefaultsController 使用共享的默认值,所以就这样了。相反,我可以在窗口控制器中创建自己的默认控制器,为其提供静态默认对象,并将绑定连接到该对象。但这并不完全有效。当我尝试在默认对象上使用 KVO 时,我没有收到任何更改通知。我使用常规 NSUserDefaults 对象(不是子类)再次尝试此操作,并且再次没有 KVO 通知。替换共享默认对象后,KVO 完全按照我的预期工作。

有谁知道当我不使用共享默认值时如何让绑定和 KVO 工作?

有帮助吗?

解决方案 4

由于我还没有找到一个解决办法,我决定采取最后CocoaHeads雪城会议期间给我一些建议,并切换到使用类别的子类,而不是NSUserDefaults的。没有一个完美的解决方案,但它会让我拿过去这个问题,并重新开始工作。

其他提示

我总是包裹NSUserDefaults的东西我自己的定义类,以确保一切工作,如预期的那样。

工作流程基本上是这样的:

  1. 应用程序启动时,阅读所有需要的NSUserDefaults入的定义类。这个定义类有一个酒店的每个设置,所有的NSDictionary和仅对象是易变的,以便改变可以作出的。
  2. 任何用户接口的因素,使改变设置一定的属性的定义类
  3. 改变设置保存至NSUserDefaults作为必需的。

我发现这封装应用程序的设置可以帮助带走所有的头疼。而不是直接处理与苹果的神奇NSUserDefaults系统,你花费你的时间相互作用有了一个明确和容易地测试的定义类。

的文档提供了答案,我想。该init方法初始化一个新的实例,但不会放任何东西在搜索路径。如果你初始化自己的情况下,你需要建立你打算用手使用的域。我的猜测是,您的应用程序无法正常工作,因为不存在,你正在试图获得/设置的值,因为没有域将它们保存在

在特别地,看看addSuiteNamed:方法和NSUserDefaultsDomain常数。你需要手工设置这些让你的子类,或者比其他NSUserDefaultsstandardUserDefaults任何情况下,正常工作。

我最近一直在做类似的事情,到目前为止我的运气还不错。我创建一个标准 NSObject 子类(参数为 MYUserDefaults)。它具有我想要的属性(主机、用户名等)。有些属性属于 NSUserDefaults,有些属性属于钥匙串等。它有一个标准 +sharedUserDefaults 单例方法。(*)

在窗口所有者(NSWindowController 或 AppDelegate)中,我提供了一个 -sharedUserDefaults. 。然后,我使用简单的键路径(sharedUserDefaults.host)将其绑定到我想要的设置。我通常会避免在绑定中使用键路径,因为它们经常会混淆事物,但在这里我认为它可以使一切保持清晰,同时处理需要防止 NIB 创建额外的非单例版本的特殊情况。

(*) 没有花哨的“强制单例“东西(这也可能解决你的问题)。我是唯一一个认为苹果应该在这份文档上大写“不要使用它,除非你知道为什么需要它,然后不要使用它”的人吗?我发现让没有经验的开发人员看到这些代码是危险的。我上一个项目中的一半对象有 +allocWithZone: 超载。对我来说,打电话是一种不好的形式 +alloc, ,并获取指向现有对象的指针。除非绝对必要,否则不要对我撒谎。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top