首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSUserDefaults问题

NSUserDefaults问题
EN

Stack Overflow用户
提问于 2010-09-21 19:20:30
回答 3查看 2.7K关注 0票数 0

我在我的应用程序委托applicationDidFinishLaunching方法中有以下内容:

代码语言:javascript
复制
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if([defaults objectForKey:@"AcceptTC"] == nil){
    NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"NO" forKey:@"AcceptTC"];
    [defaults registerDefaults:appDefaults];
}

在我的RootViewController viewDidLoad方法中有以下内容:

代码语言:javascript
复制
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if(![defaults boolForKey:@"AcceptTC"]){
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Notice" message:@"By using this application you agree to be bound by the Terms and Conditions as stated within this application." delegate:self cancelButtonTitle:@"No Deal" otherButtonTitles:@"I Understand",nil];
    [alert show];
    [alert release];
}

我的警报视图代理执行以下操作:

代码语言:javascript
复制
if(buttonIndex == 0){
            exit(0);
        }
        else{
            NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
            [defaults setObject:@"YES" forKey:@"AcceptTC"];
        }

但是,当我单击“我理解”(按钮索引1),然后重新启动应用程序时,我仍然看到警报视图!即使我已经明确地将该值设置为YES。

我不知道如何改变这一点。:(我只想在用户第一次启动应用程序时显示它-我不想每次用户想要使用它时都显示它。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-21 19:28:15

关注registerDefaults

注册域的内容不写入磁盘;您需要在每次应用程序启动时调用此方法。您可以将一个plist文件放在应用程序的Resources目录中,并使用从该文件读取的内容调用registerDefaults:。

代码语言:javascript
复制
// Load default defaults
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary \
    dictionaryWithContentsOfFile:[[NSBundle mainBundle] \ 
    pathForResource:@"Defaults" ofType:@"plist"]]];

取自this SO answer的代码。

另一篇关于NSDefaults的博客文章

  • http://retrodreamer.com/blog/2010/07/slight-change-of-plan/
票数 2
EN

Stack Overflow用户

发布于 2010-09-21 19:39:55

在我的应用程序中,我使用的是带布尔值的NSUserDefaults,运行良好。

当第一个ViewController加载时,它将执行以下操作:

代码语言:javascript
复制
BOOL terms = [[NSUserDefaults standardUserDefaults] boolForKey:@"termsaccepted"];

if (!terms) {
   [self presentModalViewController:disclaimerViewController animated:YES];
}

在免责声明视图中,点击按钮后:

代码语言:javascript
复制
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"termsaccepted"];
[[NSUserDefaults standardUserDefaults] synchronize];

我想你漏掉了“同步”这部分。然而,我发现使用bool也更流线型。

票数 7
EN

Stack Overflow用户

发布于 2010-09-21 19:34:59

也许你需要在默认情况下调用synchronize来将更改保存到磁盘?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3759761

复制
相关文章

相似问题

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