首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone应用:如何从root.plist获取默认值?

iPhone应用:如何从root.plist获取默认值?
EN

Stack Overflow用户
提问于 2009-09-16 05:46:21
回答 7查看 11.4K关注 0票数 13

我正在开发一个iPhone应用程序

我从root.plist读取了一个密钥,如下所示:

代码语言:javascript
复制
NSString *Key1Var = [[NSUserDefaults standardUserDefaults] stringForKey:@"Key1"];

("Key1“是root.plist中已经设置了默认字符串值的PSMultiValueSpecifier )

一旦用户进行了设置,它就能正常工作。但是,如果用户在进行任何设置之前运行该应用程序,他将获得"Key1“的nil。在这种情况下,我期望的是我为"Key1“设置的默认值。我需要做什么,以便用户不必进行设置,才能使应用程序第一次运行?

你好,哈里什

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-05-08 19:40:32

有关完整的解决方案,请参阅this question

实际上,您希望在访问设置之前运行以下代码:

代码语言:javascript
复制
- (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对象中,这样就不会再返回nil值,也不必在代码中重复默认设置。

票数 15
EN

Stack Overflow用户

发布于 2009-09-16 05:56:35

在我尝试获取我的设置之前,我会在启动后的早期执行此操作:

代码语言:javascript
复制
    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");
票数 4
EN

Stack Overflow用户

发布于 2017-04-24 23:56:51

基于Mike Weller's原始解决方案的Swift 3版本,如果有人需要它:

代码语言:javascript
复制
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)
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1431148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档