同步后无法从 [NSUserDefaults standardUserDefaults] 读取值

发布于 2024-08-30 08:55:44 字数 1893 浏览 0 评论 0原文

在应用程序委托 didFinishLaunching 方法中,我使用以下代码构建一个新的 NSDictionary 以用作用户的新设置包:

NSNumber *testValue = (NSNumber*)[[NSUserDefaults standardUserDefaults] objectForKey:@"settingsversion"];
if (testValue == nil)
{
    NSNumber *numNewDB = [NSNumber numberWithBool:NO];
    NSNumber *numFirstUse = [NSNumber numberWithBool:YES];
    NSDate *dateLastStatic = [NSDate date];
    NSDate *dateLastMobile = [NSDate date];
    NSNumber *numSettingsversion = [NSNumber numberWithFloat:1.0];

    NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                 numNewDB, @"newdb",
                                 numFirstUse, @"firstuse",
                                 numSettingsversion, @"settingsversion",
                                 dateLastStatic, @"laststaticupdate",
                                 dateLastMobile, @"lastmobileupdate",
                                 nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

稍后在另一个 ViewController 中,我尝试从同一字典中读回一个值,另存为NSUserDefaults - 至少我认为会,但是我没有得到所需成员的任何有效对象指针lastUpdate:

在.h文件中:

NSDate *lastUpdate;

在成员函数中的.m文件中:

lastUpdate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"laststaticupdate"];

甚至,如果我打印出来[NSUserDefaults standardUserDefaults] 的内容我只得到这个:

2010-04-29 15:13:22.322 myApp[4136:207] Content of UserDefaults: <NSUserDefaults: 0x11d340>

这使我得出这样的结论:内存中的某个地方没有 standardUserDefaults 字典,或者无法确定它是这样的结构。

编辑:每次,我在设备上重新启动应用程序时,对 testValue 的检查都是 Nil,并且我正在再次构建字典,但在一次运行后它应该会持久存在于手机上,对吗?

我在两者之间做错了什么吗?我感觉我还没有真正理解如何在 iPhone 上加载和保存某个应用程序的持久设置。

除此之外我还需要做些什么吗?在 XCode 中集成 settings.bundle 还是手动将字典保存到 Documents 文件夹?

有人可以帮我吗?多谢!

In the Application Delegate didFinishLaunching method, I am using the following code to build up a new NSDictionary to be used as the new settings bundle for the user:

NSNumber *testValue = (NSNumber*)[[NSUserDefaults standardUserDefaults] objectForKey:@"settingsversion"];
if (testValue == nil)
{
    NSNumber *numNewDB = [NSNumber numberWithBool:NO];
    NSNumber *numFirstUse = [NSNumber numberWithBool:YES];
    NSDate *dateLastStatic = [NSDate date];
    NSDate *dateLastMobile = [NSDate date];
    NSNumber *numSettingsversion = [NSNumber numberWithFloat:1.0];

    NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                 numNewDB, @"newdb",
                                 numFirstUse, @"firstuse",
                                 numSettingsversion, @"settingsversion",
                                 dateLastStatic, @"laststaticupdate",
                                 dateLastMobile, @"lastmobileupdate",
                                 nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

Later in another ViewController I am trying to read back a value from that same Dictionary, saved as the NSUserDefaults - well at least I thought it would, but I don't get any valid object pointer for the desired member lastUpdate back there:

in .h file:

NSDate *lastUpdate;

in the .m file in a member function:

lastUpdate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"laststaticupdate"];

Even, if I print out the content of [NSUserDefaults standardUserDefaults] I only get this:

2010-04-29 15:13:22.322 myApp[4136:207] Content of UserDefaults: <NSUserDefaults: 0x11d340>

This leads me to the conclusion that there is no standardUserDefaults dictionary somewhere in memory or it cannot be determined as such a structure.

Edit: Every time, I restart the app ión the device, the check for testValue is Nil and I am building up the dictionary again but after one run it should be persistent on the Phone, right?

Am I doing something wrong somewhere in between? I have the feeling that I yet didn't really understand how to load and save settings persistent for a certain application on the iPhone.

Is there anything I have to do additionally to this? Integrating a settings.bundle in XCode or saving the dictionary manually to the Documents folder?

Can someone help me out here? Thanks a lot!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

渔村楼浪 2024-09-06 08:55:44

registerDefaults 实际上并不向磁盘写入任何内容。它只是在内存中创建一个“defaults defaults”字典。因此,每次重新启动应用程序时,testValue 都应该为零。

如果要设置持久值,请使用setObject:forKey:

我不知道为什么你没有拿回有效的对象。

registerDefaults doesn't actually write anything to disk. It just creates a 'defaults defaults' dictionary in memory. So everytime you restart the app, testValue should be nil.

If you want to set persistent values, use setObject:forKey:.

I don't know why you aren't getting a valid object back however.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文