Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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 NSUserDefaults重置为registeredDefaults_Macos_Cocoa_Nsuserdefaults - Fatal编程技术网

Macos NSUserDefaults重置为registeredDefaults

Macos NSUserDefaults重置为registeredDefaults,macos,cocoa,nsuserdefaults,Macos,Cocoa,Nsuserdefaults,我有一个名为showsguidelines的默认设置,即用户是否希望在拖动文档中的项目时显示指南 使用下面我的两个助手方法设置和查询默认值对于应用程序的生命周期非常有用。但一旦应用程序重新启动,我就会遇到奇怪的问题 事情就是这样 我将showsguidelines设置为否 我重新启动应用程序 调用registerDefaults后,我验证showsguidelines是否仍然是否。([AppPreferences registerDefaults]从应用程序委托的初始化中调用。) 下次查询sh

我有一个名为showsguidelines的默认设置,即用户是否希望在拖动文档中的项目时显示指南

使用下面我的两个助手方法设置和查询默认值对于应用程序的生命周期非常有用。但一旦应用程序重新启动,我就会遇到奇怪的问题


事情就是这样

  • 我将showsguidelines设置为
  • 我重新启动应用程序
  • 调用registerDefaults后,我验证showsguidelines是否仍然是。([AppPreferences registerDefaults]从应用程序委托的初始化中调用。)
  • 下次查询showsguidelines时,我会得到YES(这是registeredDefault)
  • 奇怪的是,我有一个绑定到showsguideline的NSMenuItem,它总是尊重正确的(预期的)值。(本例中为否)

  • 我已经通过向键showsguidelines的[NSUserDefaults standardUserDefaults]添加观察者,验证了该值从未在应用程序的任何其他位置设置为YES。这也不是一个同步问题,因为我已经在应用程序启动时验证了该值是否正确

    知道我做错了什么吗

    // AppPreferences.m
    #import "AppPreferences.h"
    
    @implementation AppPreferences
    
    + (void)registerDefaults {
    
        NSURL *defaultPrefsFile = [[NSBundle mainBundle] URLForResource:@"DefaultPreferences"
                                                          withExtension:@"plist"];
        NSDictionary *defaultPrefs = [NSDictionary dictionaryWithContentsOfURL:defaultPrefsFile];
        [[NSUserDefaults standardUserDefaults] registerDefaults:defaultPrefs];
    
        NSLog(@"-register: %@", [PCAppPreferences showsGuidelines] ? @"YES" : @"NO");
    }
    
    
    #pragma mark - showsGuidelines
    + (BOOL)showsGuidelines {
    
        return [[NSUserDefaults standardUserDefaults] boolForKey:@"showsguidelines"];
    }
    
    + (void)setShowsGuidelines:(BOOL)showsGuidelines {
    
        NSLog(@"-set showsguidelines: %@", [[NSUserDefaults standardUserDefaults] boolForKey:@"showsguidelines"] ? @"YES" : @"NO");
    
        [[NSUserDefaults standardUserDefaults] setBool:showsGuidelines forKey:@"showsguidelines"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    
    @end
    
    
    // Called on App Launch
    2014-03-26 14:27:53.035 AppName[30636:303] -set showsguidelines: NO
    2014-03-26 14:27:53.035 AppName[30636:303] -register: NO
    // Called shortly afterward
    2014-03-26 14:27:58.324 AppName[30636:303] -set showsguidelines: YES
    2014-03-26 14:27:58.325 AppName[30636:303] -set showsguidelines: YES
    2014-03-26 14:27:58.342 AppName[30636:303] -set showsguidelines: YES
    

    确保您确实退出了应用程序,而不仅仅是从Xcode“运行”更新的版本。否则,将永远不会写出默认值。因此,启动应用程序时没有默认设置(默认设置为
    no
    ),而不是实际的
    no
    默认设置。因此,当您注册默认值时,它会看到该名称没有默认值,现在注册的默认值将接管,它将变成
    YES


    您始终可以使用命令行
    defaults read my.app.identifier
    检查已启动的默认设置。

    感谢您的帮助。但这不是问题所在。如果未保存任何内容(在我的DefaultPreferences.plist中指定),则在注册默认值后注销的“否”在第一次启动时应为“是”。不管怎样,我只是尝试了你的建议,退出了应用程序,然后从磁盘(不是Xcode)运行了应用程序。但同样的事情正在发生。