【问题标题】:NSUserDefaults not being saved in simulator ,even though I use synchronizeNSUserDefaults 没有保存在模拟器中,即使我使用同步
【发布时间】:2013-08-22 04:22:58
【问题描述】:

我将字典添加到 NSUserDefaults 并调用“同步”方法,但是当我关闭我的应用程序并重新打开它时,保存在 NSUserDefaults 中的值为零。

#define kStartTime @"startTime"
#define kEndTime @"endTime"
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
NSString *startTime=@"08:00";
NSString *endTime=@"18:00";
NSDictionary *dict=[[NSDictionary alloc] initWithObjectsAndKeys:startTime,kStartTime,
                           endTime,kEndTime,
                            nil];
[defaults registerDefaults:dict];
[defaults synchronize];

viewDidLoad 方法中我称之为:

NSString *startTimeValue=[defaults stringForKey:kStartTime];

当我在模拟器中重新打开我的应用程序时,startTimeValue 仍然为零。UserDefaults 是否无法保存在模拟器中???

我的意思是当我关闭我的应用程序并在模拟器中重新打开它时,值就消失了。

在我搜索了苹果文档后,我得到了这个。

registerDefaults:.

正如Apple Document中所说:将指定字典的内容添加到注册域中。

*注册域的内容没有写入磁盘;*每次应用启动时都需要调用这个方法。可以在应用的Resources目录下放置一个plist文件,调用registerDefaults : 包含您从该文件中读取的内容。

所以registerDefaults:的功能是在app中设置默认值,synchronize不会将默认值存入磁盘

【问题讨论】:

  • 检查我更新的答案...只需复制并运行即可获得值...
  • 尝试保存整个字典,如:[defaults setValue:dict forKey:@"dictionary"];并像这样获取它: NSMutableDictionary *dict=[[NSMutableDictionary alloc]init];和 dict=[defaults valueForKey:@"dictionary"];
  • 我刚刚编辑了你的代码并且工作正常检查它......
  • 仅供参考,除非您需要通过 Settings.app 获取更改,否则不应显式调用同步。
  • 转到 /users/USER_NAME/Library/Application\ Support/iPhone\ Simulator/6.1/Applications/APP_KEY/Library/Preferences/。如果您有 *.plist 文件,则意味着您正确保存了数据。您可以打开此文件并检查数据是否正确。

标签: ios nsuserdefaults


【解决方案1】:
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    NSDictionary *dict=[[NSDictionary alloc] initWithObjectsAndKeys:startTime,@"kStartTime",
                        endTime,@"kEndTime",
                        nil];
    [defaults registerDefaults:dict];
    [defaults synchronize];


    NSString *startTimeValue=[defaults stringForKey:@"kStartTime"];

    NSLog(@"%@",startTimeValue);

你需要像这样添加 @"value" 这样的键。

现在试试这段代码....

【讨论】:

  • 如果 kEndTime 是一个常量,为什么需要将 @"kEndTime" 作为键?
  • 谢谢,但kStartTime #define kStartTime @"###",我只是忘记粘贴了。我会尽快编辑它。
【解决方案2】:

我认为您在注册默认值之前尝试从 NSUserDefaults 读取值。 如果您注册默认值,这些值不会保存到磁盘,它们将不会持续到下一次应用程序启动。每次启动应用程序时都必须注册默认值。

当你从 NSUserDefaults 读取一个对象并且你之前没有保存过值时,将返回注册的默认值。如果您之前保存了一个值,则该值将被返回。

在您发布的代码中,您没有将任何内容保存到 userDefaults。因此,您注册为默认值的值将被返回。如果您还没有注册任何值,这将返回 nil。

注册默认值的代码应该放在一个在应用程序生命周期的早期运行的方法中。我建议使用application:didFinishLaunchingWithOptions:

如果要将多个值保存到 NSUserDefaults,则必须使用多个 setObject:forKey: 调用。
registerDefaults: 不能用于同时将多个键保存到 NSUserDefaults!

【讨论】:

  • 它真的对我有用!我将 registerDefaults: 替换为 SetObject:forKey: 。 :)
  • registerDefaults 可以将多个键保存到 NSUserDefaults。问题出在registerDefaults:。正如Apple Document中所说:将指定字典的内容添加到注册域。 注册域的内容没有写入磁盘;您需要在每次应用程序启动时调用此方法
猜你喜欢
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 2013-05-27
  • 2011-11-09
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多