为什么在NSUserDefault中存储为Object的Double值不能反映在UITableViewCell中?

时间:2011-10-23 18:34:05

标签: iphone objective-c delegates nsuserdefaults uialertview

我正在尝试将Double值存储在NSUserDefault但是我能够存储它(因为我的NSLog值显示真值),当我尝试重新加载UITableView时,其Cell值不是使用userdefault中的当前值更新。

这种奇怪的行为只有在我从setUserDefaults

的委托方法调用 UIAlertView 方法时才会发生

为什么会出现这种奇怪的行为?

这是我的代码:

- (void)setUserDefaults
{
    NSLog(@"setUserDefault : empArray: %d, empCount: %d",empArray.count, empCount);
    NSMutableDictionary *empData = [[NSMutableDictionary alloc] init];
    if (empArray.count>1)
        empData = [empArray objectAtIndex:(empCount-1)];   // because empCount starts from 1. and empArray[0] = empCount 1
    else
        empData = [empArray objectAtIndex:0];

    [userDefault setObject:[NSString stringWithFormat:@"%.2f",[empData objectForKey:@"salary"]] forKey:@"salary"];
    NSLog(@"setUserDefaults: salary=%.2f",[[empData objectForKey:@"salary"] doubleValue]);

    [empData release];

    [self.tblView reloadData];
}

UIAlertView的委托方法如下:

-(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger) buttonIndex
{
    if (alertView.tag == 1)    // btnRemoveEmpPressed. 
    {
        if(buttonIndex==0)
        {
            NSLog(@"buttonIndex 0");
        }
        else
        {
            NSLog(@"empRemovedPressed OK, buttonIndex 1, empArray Count %d, empCount %d",empArray.count, empCount);
            //        [empArray removeObjectAtIndex:(empCount)];
            empCount -= 1;
            lblTitle.text = [NSString stringWithFormat:@"Employee %d",empCount];
            [self setUserDefaults];
        }
//        [tblView reloadData];
    }
    else if (alertView.tag == 2)
    {
        if (buttonIndex==1)
        {
            [self resetUserDefaults];
            empCount = 1;
            [empArray removeAllObjects];
            lblTitle.text = [NSString stringWithFormat:@"Employee %d",empCount];
        }
    }
}

2 个答案:

答案 0 :(得分:6)

您应该使用setDouble:forKey:的{​​{1}}方法,让它为您管理价值。另外NSUserDefaults synchronize以保存以供日后使用的值。

答案 1 :(得分:5)

  • 设置用户默认值时,您没有使用doubleValue。要么这样做,要么就像赫兹说的那样,使用setDouble方法。
  • 更新后,您没有在默认对象上调用synchronize
  • 不要发布empData,你没有保留它
  • 我假设userDefault已在其他地方设置,并且在您使用时不是nil