与NSUserDefaults共舞

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-02 03:11 点击:

在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的专栏

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Lexical or Preprocessor Issue 'xxx.h
      • ios学习笔记(二)xcode 4.3.2下实现基本交互
      • ios版本的helloworld
      • iphone(object-c) 内存管理(3) 有效的内存管理 前半部分
      • ios学习笔记(一)xcode 4.3.2下创建第一个ios项目
      • IOS类似iphone通讯录TableView的完整demo【附源码】
      • UITableView一些方法
      • [iPhone中级]iPhone团购信息客户端的开发 (二)
      • iphone(object-c)内存管理(1)
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1