我需要从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传递来制作条件的问题。 谢谢你的回答。
答案 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++;
}