当前位置:编程学习 > wap >>

与NSUserDefaults共舞

在iOS app中,NSUserDefaults非常便利。程序员可以在其中存储应用程序选项,还可以通过iTunes备份它们——可以让它们在系统设置程序中显示。要实现这个,你需要创建一个Settings.bundle并描述清楚你想在设置程序中显示的选项以及如何显示它们。我们来演示一下如何添加一个Bool值bounces到设置程序中。首先创建Settings.bundle(通过Xcode的New FileàResourcesàSettingsBundle模板)。编辑Root.plist文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST1.0//EN"
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plistversion="1.0">
<dict>
    <key>StringsTable</key>
    <string>Root</string>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Type</key>
            <string>PSToggleSwitchSpecifier</string>
            <key>Title</key>
            <string>Bounces</string>
            <key>Key</key>
            <string>bounces</string>
            <key>DefaultValue</key>
            <true/>
        </dict>
    </array>
</dict>
</plist>

注意,我们把默认值设置为true。接下来,为Bounces属性创建helper类(用于存取该属性)。bounces属性是单例的,实现如下:

-(BOOL)bounces {
    return[[NSUserDefaultsstandardUserDefaults] boolForKey:@"bounces"];
}

-(void)setBounces:(BOOL)bounces {
    [[NSUserDefaultsstandardUserDefaults] setBool:bounces forKey:@"bounces"];
    [[NSUserDefaultsstandardUserDefaults] synchronize];
}

 

这些东西你可能都知道,但这个代码里有两个Bug。

 

1. 如果存在默认值,你必需在Settings.bundle/Root.plist中加以说明同时需在代码中注册默认值。

 

也就是说,当你用NSUserDefaults读取属性时(至少是第一次),Root.plist中的默认设置是无效的。我不知道这种情况是否已documented,但我在测试中确实发现了这点。

要解决这个Bug,需要在你的Helpler类中加入下列方法:

+(void)initialize {
    [[NSUserDefaultsstandardUserDefaults] registerDefaults:
        [NSDictionarydictionaryWithObjectsAndKeys:
            [NSNumber numberWithBool:YES],@"bounces",nil]];
}

2.当应用程序进入后台,需要synchronize

发现这点时,我相当不解。当你的app转入后台,打开系统设置程序,改变属性值,然后切回app,你看不到新设置的属性值!要解决这个Bug,需要显式地调用synchronize方法:

-(void)applicationWillEnterForeground:(UIApplication*)application {
    [[NSUserDefaultsstandardUserDefaults] synchronize];
    // ...
}

这个问题并不会引起用户的注意,但一个高质量的应用程序应当注意这点。再次申明,本文内容不基于任何文档,仅仅是我在自己的测试中遇到的问题。

 

摘自 kmyhy的专栏
补充:移动开发 , IOS ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,