所以,我正在构建一个包含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"]];
答案 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:");
}