2009-10-14 1 views
0

Мне нужно выбрать string valur из NSMutableArray, а затем сохранить его в plist. Я создал NSMutableArray для отображения информации в Table View. Максимально допустимый индекс - 8. (вставить только два в пример)Работает с номером строки, содержащейся в NSArray

Проблема, если строка не существует, появляется следующая ошибка: 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 для создания условий. Спасибо за ответ.

+0

Я предлагаю сделать объект модели вместо того, чтобы жонглировать ваши данные в массиве и словарь объектов, как это. Я понятия не имею, что должен делать этот код. Кроме того, я думаю, что вам не хватает фигурных скобок вокруг групп сообщений setObject: forKey: ', они не являются необязательными, как в Python. –

ответ

2

похоже, что вы явно проверяете smOne от индексов с 1 по 8. Но вы также упомянули, что массив может иметь до 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] не всегда будет уникальным.

+0

Ну, ваш код совершенен; Я тестировал NSenumerator, но это проще всего. Большое спасибо за объяснения. привет, ronan. – ronan

+0

Это в основном ярлык для использования NSEnumerator, называемый быстрым перечислением. – pxl

+0

Быстрое перечисление не связано с NSEnumerator. – Chuck

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++;  
    } 

Но ничего не происходит. Если я попытаюсь с (i = 0; i < 9; i ++) и (i + 1) вместо [i], я получаю те же ошибки границ в первом примере.

Еще раз спасибо за помощь.

+0

читает документацию на Apple: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocFastEnumeration. html – pxl

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++; 
} 
+0

будьте осторожны, когда вы делаете такие вещи, как [serArray insertObject: SMSer atIndex: (0 + b)]; ... вы можете потенциально пропускать индексы и создавать еще больше проблем – pxl