加载/保存NSUserDefaults阵列 - Bools?

时间:2015-06-12 16:47:11

标签: ios objective-c cocoa-touch nsarray

所以,我正在构建一个包含100个项目清单的应用程序。

我希望创建一个bools数组,指示项目是否“已选中”,然后使用NSUserDefaults将其保存到设备,以便每次运行应用时都可以加载它

我理解通过阅读你不能在NSArrays中存储bool值所以我选择了一个包含字符串@"YES"@"NO"的可变数组...我几乎可以肯定这是一个糟糕的方式这样做,但我没有想法。

我像这样创建我的数组:

boolArrayOfCheckList = [[NSMutableArray alloc] initWithCapacity:100];
    for (NSInteger i = 0; i < 100; i++){
        [boolArrayOfCheckList addObject:[NSString stringWithFormat:@"NO"]];      
    }

当使用IBAction检查项目时,它会更新与该按钮关联的索引处的数组(这似乎是添加到数组而不是替换所述索引处的对象:( ...) :

[boolArrayOfCheckList insertObject:[NSString stringWithFormat:@"YES"] atIndex:0];

然后像这样保存数组:

[[NSUserDefaults standardUserDefaults] setObject:boolArrayOfCheckList forKey:@"myBoolArray"];

当我重新加载应用程序时,ViewdidLoad加载密钥:

NSMutableArray *boolArrayOfCheckList = (NSMutableArray *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myBoolArray"];

并比较像这样的元素并相应地加载项目选中/取消选中:

if([[boolArrayOfCheckList objectAtIndex:0] isEqualToString:@"YES"]) ... //do this

但是当我添加字符串并且无法再次加载数据时,我得到了一些有趣的结果。

必须有更好的更有效的方法将清单存储在可以相应保存/更新的阵列中。怎么办呢?

谢谢。

更新

刚刚注意到我插入而不是替换,所以这解释了数组越来越大而不是替换特定索引处的对象。现在这样做:

[boolArrayOfCheckList replaceObjectAtIndex:1 withObject:[NSString stringWithFormat:@"YES"]];

1 个答案:

答案 0 :(得分:0)

您可以使用NSNumber BOOL @YES@NO代替{“1”} @“YES”和@“NO”。

NSString

获取值:

NSDictionary *test = @{@"key" : @YES};

BOOL keyBoolValue = [test[@"key"] boolValue];
NSLog(@"keyBoolValue: %i", keyBoolValue);

if (keyBoolValue == YES) {
    NSLog(@"true:");
}
else {
    NSLog(@"false:");
}