2010-11-03 10 views
0

Comment faire pour tous,déclaration de commutateur à l'aide d'un selectedSegmentIndex

Ceci est la première fois l'affichage sur le site, donc je suppose que je ne l'ai pas suivi toutes les formats et protocoles correctement.

Mon application a un UIView contenant une liste de questions, et un UISegmentedControl appelé "question_btn" pour chaque question. Le UISegmentedControl a 2 segments, le premier pour une réponse NON, le 2ème pour une réponse OUI, correspondant à chaque question. Chaque "question_btn" appelle individuellement - (void) processQuestions {}, mais quand je clique sur chaque "question_btn" seul le dernier est traité correctement. Toutes les précédentes "question_btns" appellent la méthode processQuestions, mais n'implémentent pas son code.

Im mon problème avec le UISegmentControl, ou l'instruction switch, ou les deux.

Toutes les suggestions seraient grandement appréciées.

Le bouton est défini comme suit

question_btn = [[[UISegmentedControl alloc] initWithFrame:CGRectMake(QUESTION_BUTTON_XPOS, questionsButton_YPos, 80, 20)] autorelease]; 
[question_btn insertSegmentWithTitle:@"No" atIndex:0 animated:NO]; 
[question_btn insertSegmentWithTitle:@"Yes" atIndex:1 animated:NO]; 
[question_btn setEnabled:YES forSegmentAtIndex:0]; 
[question_btn setEnabled:YES forSegmentAtIndex:1]; 
question_btn.segmentedControlStyle = UISegmentedControlStyleBar; 
question_btn.tintColor = [UIColor colorWithRed:200.0/255.0 green:200.0/255.0 blue:200.0/255.0 alpha:1.0]; 
[question_btn addTarget:self action:@selector(processQuestions) forControlEvents:UIControlEventValueChanged]; 

Voici les processQuestions

- (void) processQuestions 
{ 
//NSLog(@"QuestionsView processQuestions: Called"); 
//Process the questions i.e. determine whether yes or no was the answer 

    answersArray = [[NSMutableArray alloc] init]; 

    int selectedIndex; 

    selectedIndex = [question_btn selectedSegmentIndex]; 

    switch (selectedIndex) 
    { 
     case 0: 

      NSLog(@"QuestionsView processQuestions: No answered");  

      break; 

     case 1:  

      NSLog(@"QuestionsView processQuestions: Yes answered");  

      break; 
    } 

    [answersArray addObject:[NSNumber numberWithInt:selectedIndex]]; 

    NSLog(@"QuestionsView processQuestions: answersArray contains: %@", answersArray); 
} 

Voici comment je suis arrivé le code pour itérer correctement et obtenir la valeur d'index de question_btn sélectionné. Il s'agissait juste de créer un tableau mutable pour contenir les objets question_btn, , puis de définir la valeur d'index sélectionnée pour chaque bouton en utilisant une boucle for. buttonsArray est défini dans ma méthode createView.

buttonsArray = [[NSMutableArray alloc] init]; 

- (void) processQuestions 

{// NSLog (@ "QuestionsView processQuestions: Appelée");

answersArray = [[NSMutableArray alloc] init];   

int selectedIndex; 

for (int i = 0; i < numQuestions; i ++) 
{ 
    question_btn = (UISegmentedControl*)[buttonsArray objectAtIndex:i];  

    selectedIndex = [question_btn selectedSegmentIndex]; 

    switch (selectedIndex) 
    { 
     case 0: 

      NSLog(@"QuestionsView processQuestions: No answered for question: %d", i + 1);    

      break; 

     case 1:    

      NSLog(@"QuestionsView processQuestions: Yes answered for question: %d", i + 1);  


      break;  
    } 

    [answersArray addObject:[NSNumber numberWithInt:selectedIndex]]; 
} 
    NSLog(@"QuestionsView processQuestions: answersArray contains: %@", answersArray); 

}

+0

Pouvez-vous réindexer votre code correctement? –

+0

Tous les contrôles segmentés sont ajoutés à la même vue? Comment savez-vous à quelle question la méthode processQuestions est-elle appelée? – Anna

Répondre

0

Si vous avez une liste de questions, vous pouvez utiliser un tableau de contrôle Segemnted. Vous pouvez avoir un bouton, 'Obtenir résultat' ainsi quand pressé, vous itérez à travers tous les contrôles segmentés et vérifiez là l'index choisi (oui/non - 0/1).

maintenant, dans votre code ci-dessus, processQuestions est appelé pour le changement d'état de chaque contrôle segmenté. Si la valeur par défaut est conservée par l'utilisateur, il n'ajoutera pas de résultat au tableau de réponses.

+0

Bonjour karim, je ne suis pas sûr de ce que vous voulez dire quand vous dites "si la valeur par défaut est conservée par l'utilisateur". – dBastible

+0

[question_btn addTarget: action de soi: @selector (processQuestions) forControlEvents: UIControlEventValueChanged]; Ainsi, processQuestions ne sera appelé que lorsque l'utilisateur tapera sur le contrôle de segment. Que faire si l'utilisateur ne touche pas, et de considérer l'index sélectionné par défaut dénote la bonne réponse? – karim

+0

Merci Karim, je comprends maintenant. – dBastible