使用NSArray中包含的字符串数

时间:2009-10-14 14:55:25

标签: objective-c cocoa nsarray

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

如果String不存在的问题,我收到以下错误: 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
 }

如果所有对象都存在,则此代码有效,但如果错过了index中的某个对象,则此代码失败。 我真的不知道如何正确检查对象是否存在,导致上面的代码看起来效果不好。

我尝试过使用[self.smOne count],但是作为Int或String传递来制作条件的问题。 谢谢你的回答。

3 个答案:

答案 0 :(得分: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]可能并不总是唯一的。

答案 1 :(得分: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],我会在第一个例子中得到相同的边界错误。

再次感谢您的帮助。

答案 2 :(得分: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++;
}