2010-07-25 7 views
2

J'ai un contrôleur de vue de sélection pour sélectionner une source chimique et éventuellement une concentration. Si la source n'a pas de concentrations, elle ne présente qu'un seul sélecteur. Il est rempli par un NSDictionary avec les noms de type source comme keys et un objet de modèle personnalisé que j'ai créé appelé Chemical qui a quatre propriétés, deux NSString, un float et un BOOL.Pourquoi cette boucle for n'est-elle pas exécutée?

Lorsque je déclenche cela avec un dictionnaire qui a 2 composants, je veux extraire les quatre valeurs du Chemical qui est représenté. Notez que je remplis le sélecteur avec les valeurs des deux premières propriétés, mais pas le float ou le BOOL. Je parcours le tableau pour la clé qui est sélectionnée dans le premier composant et vérifie la chaîne du deuxième composant par rapport à la propriété chemConcentration de chacun des Chemical s dans le tableau clé/valeur. Lorsque le chemConcentration correspond, je sais que j'ai le droit Chemical et je peux obtenir ses propriétés à renvoyer.

Ouf! Le problème est que même si je sais que j'arrive à la boucle for, elle semble être ignorée. Le NSLog juste avant qu'il imprime, mais l'intérieur ne le fait pas. sourceConstant et sourceIsLiquid séjour 0.0 et NO

- (IBAction)selectedSourceButton { 
    NSLog(@"selectedSourceButton pressed"); 
    NSInteger sourceRow = [picker selectedRowInComponent:kSourceComponent]; 
    NSString *selectedSource = [self.sources objectAtIndex:sourceRow]; 
    NSArray *selectedChemicalGroup = [dictionaryOfSources objectForKey:selectedSource]; 
    NSInteger concentrationRow = [picker selectedRowInComponent:kConcentrationComponent]; 
    NSString *selectedConcentration = [[NSString alloc] init]; 
    float selectedConstant = 0.0; 
    BOOL selectedIsLiquid = NO; 

    if (numberOfComponents == 2) { 
     NSLog(@"numberOfComponents = 2 if/then chosen"); // <-- This prints. 
     selectedConcentration = [self.concentrations objectAtIndex:concentrationRow]; 
     NSLog(@"begin selectedConcentration for loop. Number of loops = %d", [selectedChemicalGroup count]); // <-- And so does this. 
     for (int i; i<[selectedChemicalGroup count]; i++) { // <-- But this doesn't seem to fire! 
      NSLog(@"selectedConcentration = %@, from selectedChemicalGroup = %@", selectedConcentration, [[selectedChemicalGroup objectAtIndex:i] chemConcentration]); // <-- Because this doesn't print. 
      if ([selectedConcentration isEqualToString:[[selectedChemicalGroup objectAtIndex:i] chemConcentration]]) { 
      selectedConstant = [[selectedChemicalGroup objectAtIndex:i] chemConstant]; 
      selectedIsLiquid = [[selectedChemicalGroup objectAtIndex:i] chemIsLiquid]; 
      } 
     } 
    } 
    else { 
     selectedConcentration = @""; 
     selectedConstant = [[selectedChemicalGroup objectAtIndex:0] chemConstant]; 
     selectedIsLiquid = [[selectedChemicalGroup objectAtIndex:0] chemIsLiquid]; 
    } 
    NSLog(@"selectedSourceButton source to return = %@, concentration = %@, sourceConstant = %1.7f, isLiquid = %d", selectedSource, selectedConcentration, selectedConstant, selectedIsLiquid); 
    if ([self.delegate respondsToSelector:@selector (sourcePickerViewController:didSelectSource:andConcentration:andConstant:andIsLiquid:)]) { 
     [self.delegate sourcePickerViewController:self didSelectSource:selectedSource andConcentration:selectedConcentration andConstant:selectedConstant andIsLiquid:selectedIsLiquid]; 
    } 
} 

Répondre

5

comte initialize boucle i

for (int i = 0; i<[selectedChemicalGroup count]; i++) 
2

Est-ce que ce qui suit et vous comprendrez pourquoi:

int i; 
NSLog(@"%d", i); 
6

Vous devez initialiser votre variable i: for (int i = 0; ...

Mais il y a une meilleure façon de faire, en utilisant « énumération rapide »:

for (MyChemicalGroupClass *group in selectedChemicalGroup) { 
    if ([selectedConcentration isEqualToString:[group chemConcentration]]) { 
    ... 
    } 
} 
+0

+ pour le dénombrement rapide – Vladimir