Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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/1/cocoa/3.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
Objective c 使用我自己的(不是共享的)NSUserDefaults对象时出现KVO和绑定问题_Objective C_Cocoa_Cocoa Bindings_Nsuserdefaults_Key Value Observing - Fatal编程技术网

Objective c 使用我自己的(不是共享的)NSUserDefaults对象时出现KVO和绑定问题

Objective c 使用我自己的(不是共享的)NSUserDefaults对象时出现KVO和绑定问题,objective-c,cocoa,cocoa-bindings,nsuserdefaults,key-value-observing,Objective C,Cocoa,Cocoa Bindings,Nsuserdefaults,Key Value Observing,我正在应用程序中对NSUserDefaults进行子类化。这样做的一个副作用是我不能使用[NSUserDefaults sharedUserDefaults],我必须有一个类方法来提供我自己的静态默认对象。这在代码中不是一个问题,但现在我正在将首选项UI与绑定连接起来,这证明很棘手 共享的NSUserDefaultsController使用共享的默认值,因此这是错误的。相反,我可以在窗口控制器中创建自己的默认控制器,为其提供静态默认对象,并将绑定连接到该对象。但这并不能完全起作用。当我尝试在默认

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

共享的NSUserDefaultsController使用共享的默认值,因此这是错误的。相反,我可以在窗口控制器中创建自己的默认控制器,为其提供静态默认对象,并将绑定连接到该对象。但这并不能完全起作用。当我尝试在默认对象上使用KVO时,我没有收到任何更改通知。我用一个常规的NSUserDefaults对象(不是子类)再次尝试了这一点,并且再次尝试,没有KVO通知。在SharedDefaults对象中进行替换,KVO的工作方式正是我所期望的


在我不使用共享默认值的情况下,有人对如何让绑定和KVO工作有什么想法吗?

我认为,文档提供了答案。
init
方法初始化一个新实例,但不在搜索路径中放置任何内容。如果要初始化自己的实例,则需要手动设置要使用的域。我的猜测是,您的应用程序无法工作,因为您试图获取/设置的值不存在,因为没有域可以保存它们


特别是,请查看
addSuiteName:
方法和
NSUserDefaultsDomain
常量。您需要手动设置这些选项,以使子类或除
standardUserDefaults
之外的任何
NSUserDefaults
实例正常工作。

因为我还没有找到解决方案,我决定采纳上次CocoaHeads Syracuse会议上给我的一些建议,转而使用类别,而不是子类化NSUserDefaults。这不是一个完美的解决方案,但它会让我克服这个问题,重新开始工作。

我总是用自己的自定义类包装NSUserDefaults内容,以确保一切都按预期工作

工作流程基本上如下所示:

  • 当应用程序启动时,将所有必需的NSUserDefaults条目读取到自定义类中。此自定义类具有每个设置的属性,并且所有NSDictionary和NSArray对象都是可变的,因此可以进行更改。
  • 对设置进行更改的任何用户界面元素都绑定到自定义类的属性
  • 对设置所做的更改将根据需要保存为NSUserDefaults。
    我发现这种应用程序设置的封装有助于消除所有的麻烦。你不用直接处理苹果神奇的NSUserDefaults系统,而是花时间与一个定义良好且易于测试的自定义类进行交互。

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

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


    (*)没有“花哨”的东西(这也可以解决你的问题)。我是唯一一个认为苹果应该有大闪光灯的人吗?在这个文件上签名“除非你知道你为什么需要它,否则不要使用它,然后无论如何也不要使用它”?我发现让没有经验的开发人员看到这些代码是危险的。我在上一个项目中工作的对象中有一半重载了
    +allocWithZone:
    。对我来说,调用
    +alloc
    并获取指向现有对象的指针是一种糟糕的形式。除非绝对必要,否则不要对我撒谎。

    文档在这个问题上有点混乱,但它确实说init添加了应用程序和注册域。我还注意到一个init'ed对象在10.5中包含全局域,但在10.4中没有,所以文档可能也有点过时。无论如何,问题仅限于KVO-我的子类对象在代码中使用时保存并读取prefs,所以除非我遗漏了什么,否则搜索域似乎没有任何问题。谢谢你的回复!