2013-02-23 124 views
0

我有一个问答游戏,当答案是正确的,一个带勾号的图片将出现。由于我有很多领域,需要应用程序来记住下次启动时已完成哪些工作。我正在使用NSUserDefaults。它工作的很好,但问题是,在第一次启动时显示所有“完成”图像。我试图绕过BOOL逻辑,但没有成功。NSUserDefaults布尔逻辑

.H

BOOL doneState; 

的.m

- (void)viewDidLoad{ 

    [super viewDidLoad]; 
    [self doneHidden]; 
    [self checkBools]; 
} 

- (void)checkBools{ 

    //--------NSUserDefaults & tick sign hidden 
    BOOL saved = [[NSUserDefaults standardUserDefaults] boolForKey:@"hiddenDone"]; 
    NSLog (@"Value of my saved BOOL = %@", saved ? @"YES" : @"NO"); 
    done.hidden = saved; 
} 

-(void)doneHidden{ 
    done.hidden = YES; 
} 

当用户退出应用程序,方法如下能够记忆BOOL值

-(IBAction)flipBack:(id)sender{ 

    if (done.hidden == NO) { 
     doneState = NO; 
    } 
    else { 
     doneState = YES; 
    } 

    [[NSUserDefaults standardUserDefaults] setBool:doneState forKey:@"hiddenDone"]; 
    NSLog (@"Value of BOOL 1 = %@", doneState ? @"YES" : @"NO"); 
} 

的想法是第一隐藏名为ImageView的“完成”,然后运行BOOL。控制台在第一次启动时给出结果,即使它是这样设置的,它也不会被隐藏。

控制台输出:

Value of my saved BOOL = NO; 

我怎样才能提高它的逻辑是什么?在第一个推出

  • 隐藏图像
  • 如果退出应用程序检查,如果图像是可见的,并创建BOOL
  • 下一页推出阅读BOOL和显示图像如果以前保存的如此
+1

第一次启动时,没有存储任何值,因此您将收到NO。 – jrturton 2013-02-23 12:02:51

+0

因此,也许将含义从“隐藏”改为“回答”或任何其他内容,以便所有内容都以NO开头。 – jrturton 2013-02-23 12:08:41

回答

4

有三种选项:

  1. 更改BOOLshowImage的意义,所以你将它设置为TRUE当你想显示图像。在-[NSUserDefaults registerDefaults:]
  2. 预先登记此密钥的TRUE值代替使用boolForKey:的,使用objectForKey:和第一检查如果对象是nil(=还未设置),且仅当非空,使用-[NSNumber boolValue]得到布尔值。
+0

谢谢大家!我预先注册了对象和键,并且它工作得很好。 NSArray * keys = [NSArray arrayWithObjects:@“hiddenDone”,@“hiddenDone2”,@“hiddenDone3”,nil]; NSArray * objects = [NSArray arrayWithObjects:@“YES”,@“YES”,@“YES”,nil]; NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; NSDictionary * appDefaults = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; [defaults registerDefaults:appDefaults]; [defaults synchronize]; – Alessign 2013-02-25 13:24:11