【发布时间】:2015-06-12 16:47:11
【问题描述】:
所以,我正在构建一个应用程序,其中包含 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"]];
【问题讨论】:
-
最好使用
NSNumber将BOOLs 换成NSArray。然而,使用一个数组来保存一个项目是否被检查过听起来很容易出错。唯一将项目与清单相关联的是它们在数组中的位置。使用字典或添加BOOL作为项目的属性可能会更好。
标签: ios objective-c cocoa-touch nsarray