【问题标题】:Load/Save NSUserDefaults Array - Bools?加载/保存 NSUserDefaults 数组 - 布尔值?
【发布时间】: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"]];

【问题讨论】:

  • 最好使用NSNumberBOOLs 换成NSArray。然而,使用一个数组来保存一个项目是否被检查过听起来很容易出错。唯一将项目与清单相关联的是它们在数组中的位置。使用字典或添加 BOOL 作为项目的属性可能会更好。

标签: ios objective-c cocoa-touch nsarray


【解决方案1】:

您可以使用 NSNumber BOOL @YES@NO 代替 @"YES" 和 @"NO" 的 NSString

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

获取值:

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

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

if ([test[@"key"] boolValue] == YES) { ...

【讨论】:

  • 如何比较它们?
  • 是的,它是多余的,可以删除。它可以确保答案示例清晰。清晰可以是一种美德。
猜你喜欢
  • 2011-08-01
  • 2020-02-25
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多