代码之家  ›  专栏  ›  技术社区  ›  RibaldEddie

“defaults write”命令的编程等价物,例如,如何使用nsuserdefaults?

  •  4
  • RibaldEddie  · 技术社区  · 14 年前

    尝试以编程方式执行“defaults write”命令在OS X中的操作。我似乎不知道如何为我要查找的域获取正确的首选项字典。我可以在下面的代码中获得一些域的首选项,但相关的首选项似乎不在dict中。

    为什么/它们是在终端命令中,而不是在代码中?它们不在标准用户默认值中吗?似乎找不到。

    编辑:这些是我试图输入代码的命令:

    defaults write com.apple.dock mcx-expose-disabled -bool true
    defaults write com.apple.dashboard mcx-disabled -bool true
    
    
    
    
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    NSMutableDictionary   *dockDict = [[defaults persistentDomainForName:@"com.apple.dock"] mutableCopy];
    NSMutableDictionary   *dashDict = [[defaults persistentDomainForName:@"com.apple.dashboard"] mutableCopy];
    
    [dockDict setValue:YES forKey:@"mcx-expose-disabled"];
    
    
    [defaults setPersistentDomain:dockDict forName:@"com.apple.dock"];
    [defaults setPersistentDomain:dashDict forName:@"com.apple.dashboard"];
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   Yuji    14 年前

    唯一的问题是你在这里的行:

     [dockDict setValue:YES forKey:@"mcx-expose-disabled"];
    

    这应该是

     [dockDict setValue:[NSNumber numberWithBool:YES] forKey:@"mcx-expose-disabled"];
    

    Objective-C不会将基本类型的值“自动装箱”到对象中。

    而且,编译器应该警告您不能通过 YES setValue:forKey: . 您应该检查编译器发出的每个警告 !警告就是为了这个!

        2
  •  6
  •   JWWalker    14 年前

    使用核基础可能更容易,例如,

    CFPreferencesSetAppValue( CFSTR("mcx-expose-disabled"), kCFBooleanTrue, CFSTR("com.apple.dock") );
    CFPreferencesAppSynchronize( CFSTR("com.apple.dock") );