0

我需要从 NSMutableArray 中选择字符串 valur,然后将其保存到 plist 中。我已经构建了一个 NSMutableArray 来在表格视图中显示信息。允许的最大索引为 8。(在示例中仅粘贴两个)

如果字符串不存在的问题,我收到以下错误:sDict 是用于将数据保存到属性列表文件的字典。

编码:

- (IBAction)save:(id)sender {
(...)
NSString *One;
NSString *Two;
...etc

if ([self.smOne objectAtIndex:0])
One = [self.smOne objectAtIndex:0];
if ([self.smOne objectAtIndex:1])
Two = [self.smOne objectAtIndex:1];
...etc

if (One)
[sDict setObject:[self.smTwo objectAtIndex:0] 
                forKey:[UserM stringByAppendingString:One]];
[sDict setObject:[self.smThree objectAtIndex:0] 
                forKey:[UserS stringByAppendingString:One]];
[sDict setObject:[self.smFour objectAtIndex:0] 
                forKey:[UserP stringByAppendingString:One]];


if (Two)
[sDict setObject:[self.smTwo objectAtIndex:1] 
                 forKey:[UserM stringByAppendingString:Two]];
[sDict setObject:[self.smThree objectAtIndex:1] 
                 forKey:[UserS stringByAppendingString:Two]];
[sDict setObject:[self.smFour objectAtIndex:1] 
                 forKey:[UserParM stringByAppendingString:Two]];


 ...etc
 }

如果所有对象都存在,则此代码有效,但如果错过索引处的对象之一,则失败。我真的不知道如何正确检查对象是否存在,因为上面的代码似乎不能正常工作。

我已经尝试过 [self.smOne count] 但作为 Int 或 String 传递以创建条件的问题。感谢您的回答。

4

3 回答 3

2

看起来您正在从索引 1 到 8 显式检查 smOne。但是您还提到该数组最多可以有 8 个。因此,如果缺少它,例如 6、7 和 8,您仍然会调用[smOne objectAtIndex:6],这将导致 NSRangeException 被引发,因为 6 超出了数组的范围。

试试这个:

int i = 0;

for ( NSString *aString in self.smOne )
{

 [sDict setObject:[self.smTwo objectAtIndex:i] 
           forKey:[UserM stringByAppendingSting:aString]];
 [sDict setObject:[self.smThree objectAtIndex:i] 
           forKey:[UserS stringByAppendingString:aString]];
 [sDict setObject:[self.smFour objectAtIndex:i] 
           forKey:[UserP stringByAppendingString:aString]];

 i++;

}

它会遍历 smOne 数组中的每个对象并将对象添加到 sDict 中,而不管 smOne 中有多少项目。

另外,请注意生成密钥的方式。[UserM stringByAppendingSting:aString] 可能并不总是唯一的。

于 2009-10-14T16:57:04.210 回答
0

很抱歉再次问,但我很难找到如何从与循环一起保存的键/字符串对中重建数组。

我试过这个:

int i = 0;
for (NSString *SMServ in [temp objectForKey:
                         [UserMen stringByAppendingFormat:@"%d",i]]){
    NSString *SMMem[i];
    SMMem[i] = [temp objectForKey:[UserMen stringByAppendingFormat:@"%d",i]];
    NSArray *theArray = [ NSArray arrayWithObjects:SMMem count:i];
    i++;    
    }

但什么也没有发生。如果我尝试使用 for (i = 0; i < 9; i ++) 和 (i + 1) 而不是 [i],我会在第一个示例中得到相同的边界错误。

再次感谢您的帮助。

于 2009-10-14T20:39:40.233 回答
0

好吧,终于成功了。感谢您提供文档链接,我上次读得太快了。我确信这不是最干净的方式,但它适用于这个循环:

for (key in sDict) {
    if ([sDict valueForKey:[UserMen stringByAppendingFormat:@"%d",i]]) {
      tempMe = [sDict valueForKey:[UserMen stringByAppendingFormat:@"%d",i]];
        if (tempMe) {
        [manArray insertObject:tempMe atIndex:(0 + a)];
        [bankArray insertObject:[NSString stringWithFormat:@"%d",i] atIndex:(0 + a)];
        a++;
        }
    }
    if ([sDict valueForKey:[UserSerial stringByAppendingFormat:@"%d",i]]) {
        SMSer = [sDict valueForKey:[UserSerial stringByAppendingFormat:@"%d",i]];
        if (SMSer) {
        [serArray insertObject:SMSer atIndex:(0 + b)];
        b++;
            }
    }
    if ([sDict valueForKey:[UserPart stringByAppendingFormat:@"%d",i]]) {
        SMPart = [sDict valueForKey:[UserPart stringByAppendingFormat:@"%d",i]];
        if (SMPart) {
        [partArray insertObject:SMPart atIndex:(0 + c)];
        c++;
       }
    }
    i++;
}
于 2009-10-15T11:47:14.367 回答