2009-09-16 27 views
13

我在iPhone上的应用程序iPhone应用程序:如何从root.plist获取默认值?

工作,我读了root.plist这样的关键:

NSString *Key1Var = [[NSUserDefaults standardUserDefaults] stringForKey:@"Key1"]; 

(“密钥1”是其默认字符串值已经设置在根PSMultiValueSpecifier .plist)

一旦用户进行设置,就可以正常工作。 但是,如果用户在执行任何设置之前运行应用程序,他将获得“Key1”的nil。 在这种情况下,我期待着我为“Key1”设置的默认值。 我需要做什么, 这样用户不必做设置,让应用程序第一次运行?

问候, 哈里什

+0

可能重复.bundle默认即使你不打开设置应用程序](http://stackoverflow.com/questions/510216/can-you-make-the-settings-in-settings-bundle-default-even-if-you -dont-open-the) – 2012-05-08 11:38:23

+0

'可能',我的意思是'确切'。 – 2012-05-08 11:45:39

回答

13

的完整解决方案见this question

你基本上要访问设置之前,运行此代码:

- (void)registerDefaultsFromSettingsBundle { 
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; 
    if(!settingsBundle) { 
     NSLog(@"Could not find Settings.bundle"); 
     return; 
    } 

    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]]; 
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"]; 

    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]]; 
    for(NSDictionary *prefSpecification in preferences) { 
     NSString *key = [prefSpecification objectForKey:@"Key"]; 
     if(key) { 
      [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key]; 
     } 
    } 

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister]; 
    [defaultsToRegister release]; 
} 

这将默认值加载到standardUserDefaults对象,所以你不会再回到零值,而你不必复制代码中的默认设置。

+0

我有同样的问题,这对我工作。非常感谢。 – MaryamAyd 2012-08-14 14:26:58

+0

不幸的是,这段代码在Xcode 7.3的Swift 2.2中不起作用,我得到关于'stringByAppendingPathComponent'不可用的错误。 – Dai 2016-03-27 23:38:49

3

我做到这一点推出后初期,在我试图让我的设置:

userDefaultsValuesPath=[[NSBundle mainBundle] pathForResource:@"UserDefaults" 
                  ofType:@"plist"]; 
    userDefaultsValuesDict=[NSDictionary dictionaryWithContentsOfFile:userDefaultsValuesPath]; 

    // set them in the standard user defaults 
    [[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValuesDict]; 

    if (![[NSUserDefaults standardUserDefaults] synchronize]) 
     NSLog(@"not successful in writing the default prefs"); 
+0

但是如果你的路径是settings.bundle中默认的“root.plist”呢? – jowie 2010-08-31 14:38:15

+0

Joe:然后你得到这个包的引用并发送它'-pathForResource:'。如果因为任何原因无法这样做,您可以将plist复制到应用程序包的资源以及设置包中。 – 2010-09-25 00:06:16

0

在我的应用程序委托,我重写+initialize方法并注册新的应用程序默认偏好。

例如:

+ (void) initialize { 
    if ([self class] == [MyAppDelegate class]) {   
     // initialize user defaults dictionary 
     BOOL isFirstTimeRun = YES; 
     BOOL isKeychainTurnedOn = NO; 
     BOOL isSSLTurnedOn = YES; 
     NSString *testURLString = @"http://stackoverflow.com"; 
     NSMutableDictionary *resourceDict = [NSMutableDictionary dictionary]; 
     [resourceDict setObject:[NSNumber numberWithBool:isFirstTimeRun] forKey:kIsFirstTimeRunKey]; 
     [resourceDict setObject:[NSNumber numberWithBool:isKeychainTurnedOn] forKey:kIsKeychainTurnedOnKey]; 
     [resourceDict setObject:[NSNumber numberWithBool:isSSLTurnedOn] forKey:kIsSSLTurnedOnKey]; 
     [resourceDict setObject:testURLString forKey:kTestURLString]; 
     [[NSUserDefaults standardUserDefaults] registerDefaults:resourceDict]; 
    } 
} 
+1

如果你有一个实际的settings.bundle和root.plist资源,该怎么办? – jowie 2010-08-31 14:38:49

+1

@jowie可惜这是必需的,即使你有一个Settings.bundle和Root.plist。在用户打开“设置”窗格之前,将忽略此处指定的“默认值”。全新安装应用程序后,在打开设置窗格之前,除非手动调用“registerDefaults”,否则所有键都将返回nil。 – gmcnaughton 2013-12-31 17:26:41

0
NSBundle* mainBundle = [NSBundle mainBundle];  

// Reads the value of the custom key I added to the Info.plist 
NSString *value = [mainBundle objectForInfoDictionaryKey:@"key"]; 

//Log the value 
NSLog(@"Value = %@", value); 

// Get the value for the "Bundle version" from the Info.plist 
[mainBundle objectForInfoDictionaryKey:@"CFBundleVersion"]; 

// Get the bundle identifier 
[mainBundle bundleIdentifier]; 
+1

这是为什么被拒绝? – rckehoe 2013-12-06 14:54:56

3

下面是我在iOS 7中使用的代码,主要基于上面的Mike Weller的代码。在你的代码

- (void)registerDefaultsFromSettingsBundleWithPlist:(NSString *)plist { 
NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; 
if(!settingsBundle) { 
    NSLog(@"Could not find Settings.bundle"); 
    return; 
} 
NSString *bundle = [NSString stringWithFormat:@"%@.plist",plist]; 
NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:bundle]]; 
NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"]; 

NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]]; 
for(NSDictionary *prefSpecification in preferences) { 
    NSString *key = [prefSpecification objectForKey:@"Key"]; 
    if(key) { 
     [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key]; 
    } 
} 

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister]; 
//[defaultsToRegister release]; 
} 

然后调用它的每一个设置文件正在使用(嵌套设置),从一些地方早期像didFinishLaunchingWithOptions:

将这个方法在你AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
//register default settings into NSUserDefaults 
    @try { 
     [self registerDefaultsFromSettingsBundleWithPlist:@"Root"]; 
     [self registerDefaultsFromSettingsBundleWithPlist:@"Chat"]; 
     [self registerDefaultsFromSettingsBundleWithPlist:@"IVR"]; 
     [self registerDefaultsFromSettingsBundleWithPlist:@"Video"]; 
    } 
    @catch (NSException * e) { 
     NSLog(@"Exception: %@", e); 
     NSLog(@"Try adding the Default Value field to each preference item in the Settings.bundle plist files."); 
    } 
    @finally { 

    } 
    ... 
2

我把Mike Weller的解决方案翻译成Swift 2。0/iOS版9,并使其为我的应用程序工作:

func registerDefaultsFromSettingsBundle() { 
    guard let settingsBundle = NSBundle.mainBundle().URLForResource("Settings", withExtension:"bundle") else { 
     NSLog("Could not find Settings.bundle") 
     return; 
    } 

    guard let settings = NSDictionary(contentsOfURL: settingsBundle.URLByAppendingPathComponent("Root.plist")) else { 
     NSLog("Could not find Root.plist in settings bundle") 
     return 
    } 

    guard let preferences = settings.objectForKey("PreferenceSpecifiers") as? [[String: AnyObject]] else { 
     NSLog("Root.plist has invalid format") 
     return 
    } 

    var defaultsToRegister = [String: AnyObject]() 
    for var p in preferences { 
     if let k = p["Key"] as? String, v = p["DefaultValue"] { 
      NSLog("%@", "registering \(v) for key \(k)") 
      defaultsToRegister[k] = v 
     } 
    } 

    NSUserDefaults.standardUserDefaults().registerDefaults(defaultsToRegister) 
} 
1

迅速3版本的基础上Mike Weller's原来的解决方案,如果有人需要它:

static func registerDefaultsFromSettingsBundle() { 

    guard let settingsBundle = Bundle.main.url(forResource: "Settings", withExtension: "bundle") else { 
     print("Could not find Settings.bundle") 
     return 
    } 
    guard let settings = NSDictionary(contentsOf: settingsBundle.appendingPathComponent("Root.plist")) else { 
     print("Couldn't find Root.plist in settings bundle") 
     return 
    } 

    guard let preferences = settings.object(forKey: "PreferenceSpecifiers") as? [[String: AnyObject]] else { 
     print("Root.plist has an invalid format") 
     return 
    } 

    var defaultsToRegister = [String: AnyObject]() 
    for var p in preferences { 
     if let k = p["Key"] as? String, let v = p["DefaultValue"] { 
      print("Registering " + v.debugDescription + " for key " + k) 
      defaultsToRegister[k] = v as AnyObject 
     } 
    } 

    UserDefaults.standard.register(defaults: defaultsToRegister) 
} 
的[你可以在设置中设置
相关问题