【问题标题】:iOS - UISwitch ignoring value from NSUserDefaultsiOS - UISwitch 忽略来自 NSUserDefaults 的值
【发布时间】:2013-04-19 07:26:34
【问题描述】:

我全力以赴,但我就是想不通……请您帮忙。
我在做什么:
我有一个带有导航栏和表格视图的应用程序作为主屏幕。在导航栏的顶部,我放置了一个 UISwitch(它改变了 tableview 的内容)和一个设置按钮。开关的默认状态是关闭,当用户翻转它时,我检查设置中的所有帐户信息是否已填写,并基于此我允许他打开或给他一个警报(他应该填写首先输出他的帐户信息)并保持关闭状态。
在设置中的 accountView 上,我有一个“保存”按钮,如果按下该按钮,则使用 NSUserDefaults 存储信息,如果填写了所有帐户信息(另存为 FNAccountFiledKey),则还有一个字符串保存为“true”。 我的问题:
每次我启动应用程序时,uiSwitch 都会出于某种奇怪的原因将 FNAccountFiledKey 评估为“真”,即使 NSLog 在 if 语句说它设置为“假”之前也是如此。 - 有趣的是,如果我转到 accountView,按“保存”按钮并返回,uiSwitch 会按需要开始工作。

这是我的代码:

switchChanged 方法

{
NSString *accountInfo=[[NSUserDefaults standardUserDefaults]objectForKey:@"FNAccountFiledKey"];

NSLog(@"%@",accountInfo);

if (accountInfo==@"false") {

    [self.switch1 setOn:NO animated:YES];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Please fill out ALL your Account info first!" message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
    [alert show];

} else { //if all account info is filled out proceed as usual

if (self.switch1.on) {
    self.tableView.rowHeight= 76;
} else {
    self.tableView.rowHeight= 590;
}

//reload data when switch is changed
    [[self tableView]reloadData];}

以及AccountView中保存按钮的代码:

NSString *name=[nameField text];
NSString *surname=[surnameField text];
NSString *gender=[genderField text];
NSString *birth=[birthField text];
NSString *email=[emailField text];
NSString *phone=[phoneField text];

[[NSUserDefaults standardUserDefaults]setObject:name forKey:FNAccountNameKey];
[[NSUserDefaults standardUserDefaults]setObject:surname forKey:FNAccountSurnameKey];
[[NSUserDefaults standardUserDefaults]setObject:gender forKey:FNAccountGenderKey];
[[NSUserDefaults standardUserDefaults]setObject:birth forKey:FNAccountBirthKey];
[[NSUserDefaults standardUserDefaults]setObject:email forKey:FNAccountEmailKey];
[[NSUserDefaults standardUserDefaults]setObject:phone forKey:FNAccountPhoneKey];

NSString *tru=@"true";
NSString *fals=@"false";

if ((name.length>0)&&(surname.length>0)&&(gender.length>0)&&(birth.length>0)&&(email.length>0)&&(phone.length>0)) {
    [[NSUserDefaults standardUserDefaults]setObject:tru forKey:FNAccountFiledKey];
} else { [[NSUserDefaults standardUserDefaults]setObject:fals forKey:FNAccountFiledKey];
        }
NSLog(@"Account info complete: %@", [[NSUserDefaults standardUserDefaults]objectForKey:FNAccountFiledKey]);

有没有人知道什么会导致这种行为?
谢谢

【问题讨论】:

  • :你的问题解决了吗?
  • 是的,谢谢你的大开眼界!

标签: ios objective-c xcode nsuserdefaults uiswitch


【解决方案1】:

尝试像这样比较字符串不要使用 '==' 运算符,像这样使用 isEqualToString 。

if ([accountInfo isEqualToString:@"false"]) {

}

【讨论】:

    【解决方案2】:

    您应该尝试的第一件事是将逻辑运算符“==”替换为“isEqualToString:”,如下所示

      if([accountInfo isEqualToString:[NSString stringWithFormat:@"false"]])
      {
           //Do your stuff here
      }
    

    在您对 NSUserDefault 进行任何更改后不久,您还必须同步它

      [[NSUserDefaults standardUserDefaults] synchronize];
    

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2014-08-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      相关资源
      最近更新 更多