Partage
  • Partager sur Facebook
  • Partager sur Twitter

[IOS] Comparaison NSDictionnary pour TableView

Sujet résolu
    31 mai 2013 à 17:19:39

    Bonjour à tous ,

    je viens vers vous pour un problème qui m'agace assez..

    Je suis entrain de développer une application d'énigmes, et je souhaiterais simplement , que lorsque le joueur arrive aux question, qui se trouve dans une tableView, qu'une pastille verte s'affiche s'il à déjà répondu à la question ou rouge si ce n'est pas le cas.

    Pour cela , j'ai fait deux connexion avec donc deux NSDictionnary :

                    - Le premier recense toutes les énigmes présentes dans le niveau  : DicoDonnee

                    -Le second recense toutes les questions que le joueur a répondue. : DicoDonneQuestionRep

    Et je voudrais , que lorsque je remplis les cellules par les questions que selon , si l'id_question présente dans le premier dico est égale à idQuestion_questRep du second dico , alors sa affiche une pastille verte sinon rouge.

    Mais je galère étant donnée que ce deuxième dico est forcément pas de la même taille , à part si le joueur a répondu à toute les questions.

    voici mon code de la vue correspondant au methode du protocole de connexion et de la tableview : 

    .m

    J'appelle en premier temps les questions répondu par le joueur puis arriver à la fin de la connexion j'appelle : connexionAPI qui va me récupéré les questions du niveau et l'enregistrer dans un NSDictionnary différent.

    //////////////////////////////////////////////////


    #pragma mark -


    #pragma mark NSURLConnectionDelegate


    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data


    {  


        if(connection == self.connexion){


            [self.reicevedData appendData:data];}


        else if(connection == self.connexionQuestionRep){


            [self.reicevedDataQuestionRepappendData:data];}


    }



    - (void)connectionDidFinishLoading:(NSURLConnection *)connection


    {


        NSError* err = nil;

        if(connection == self.connexion)


        {


    NSString* jsonString = [[NSStringalloc] initWithData:self.reicevedData       encoding:NSUTF8StringEncoding];


            NSLog(@"%@", jsonString);


    self.jsonData = [NSJSONSerializationJSONObjectWithData:self.reicevedDataoptions:0error:&err];


            [indicateurChargementstopAnimating];


    tableViewQuestion.hidden = false;


            [selffonduQuestion];

            [selffonduLabelNiveau];


            [tableViewQuestionreloadData];


        }


        else if(connection == self.connexionQuestionRep)


        {


    NSString* jsonString = [[NSStringalloc] initWithData:self.reicevedDataQuestionRepencoding:NSUTF8StringEncoding];


           NSLog(@"%@", jsonString);


    self.jsonDataQuestionRep = [NSJSONSerializationJSONObjectWithData:self.reicevedDataQuestionRepoptions:0error:&err];


    dicoQuestionRep = [NSJSONSerializationJSONObjectWithData:self.reicevedDataQuestionRepoptions:0error:&err];


             [self ConnexionAPI];

    NSLog(@"%@",dicoQuestionRep);


        }



    }


    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error


    {

    }

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response


    {

    }


    #pragma mark -

    #pragma mark TableView

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView


    {

        return 1;

    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section


    {

        return [self.jsonData count];

    }


    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

        NSDictionary *id_quest = [self.jsonData objectAtIndex:indexPath.row];

    NSLog(@"%@",id_quest[@"id_question"]);


        NSString*id_question = [NSString stringWithFormat:@"%@",id_quest[@"id_question"]];


        [[NSUserDefaultsstandardUserDefaults] setObject:id_question forKey:@"id_question"];


        [[NSUserDefaultsstandardUserDefaults] synchronize];


        [selfperformSegueWithIdentifier:@"reponse"sender:nil];   


    }

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


    {


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell_Question"];


        DicoDonnee = self.jsonData[indexPath.row];

        cell.textLabel.text = DicoDonnee[@"nom_question"];


        cell.detailTextLabel.text = @"Go !";


    C'est ici que je voudrait faire la comparaison pour permettre de soit mettre la pastille verte ou rouge

    par défaut je les mis en rouge car isNotAnswer (pas répondue =))   

        cell.imageView.image = [UIImageimageNamed:[NSStringstringWithFormat:@"isNotAnswer.png"]];


        }

            return cell;

    }


    @end

    Donc j'espère que vous avez compris mon problème , sinon demandez moi =) 

    Merci d'avance 

    Cordialement

    • Partager sur Facebook
    • Partager sur Twitter
      31 mai 2013 à 17:57:04

      Bon, ton code est méga pas indenté, pense aux balise code, parce que c'est illisible.

      Ton DicoDonneQuestionRep il contient quoi exactement? C'est une liste de toutes les questions répondues, du genre:

      "id1" : YES,

      "id2" : YES,

      ... 


      Si c'est le cas, il te suffit d'utiliser [DicoDonneQuestionRep objectForKey:IDDELAQUESTION]; 

      Qui renverra nil si l'id n'est pas dans le dico (et donc question pas répondue). 


      Si tu lis les NSDictionnary un par un, tu devrais commencer par les lire (ViewDidLoad?) et toutes les mettre dans un NSArray.

      • Partager sur Facebook
      • Partager sur Twitter
        3 juin 2013 à 9:29:54

        Bonjour et merci d'avoir répondu.

        Mon code n'est pas indenter mais c'est dûe au copier coller , c'est vrai que j'aurai dû utiliser les balise, j'y avais pas penser.

        Mon dicoDonneQuestionRep me renvoie une chaine JSON qui prend comme valeur l'identifiant du niveau au quel les questions sont jouable (faille-difficile etc..), et l'identifiant de la question répondu.

        En gros, dans ma BDD , j'ai une table questionRep , qui va m'afficher la liste des identifiants des question , répondue par tel identifiant du compte du joueur.

        Mon DicoDonnee, me renvoie la liste des questions, avec leurs identifiant respectif . Donc je suis partie du principe, que si l'identifiant de la question se trouve dans le dicoDonneQuestionRep , sa voudrais dire que le joueur a répondu à la question.

        Vous avez compris ? (sa peut paraitre difficile à comprendre vu comme sa =))

        DicoDonneQuestionRep (chaine json) :

         (

                {

                "idNiveau_questRep" = 1;

                "idQuestion_questRep" = 1;

            },

                {

                "idNiveau_questRep" = 1;

                "idQuestion_questRep" = 2;

            }

        )


        et mon DicoDonnee qui recense les questions : 

        [

            {

             "id_question":"1",

             "nom_question":"Araignee",

             "message_question":"Combien de patte possede une araignee ?",

             "reponse_question":"8",

             "explication_question":"Les araignees sont dotees de huit pattes et ne disposent ni d'ailes ni d'antennes ",

             "idIndice_question":"2",

             "idNiveau_question":"1"

            }

        ]



        Donc dans cette exemple , on remarque que j'ai répondu à la question dont l'identifiant vaut 1 (diDonneQuestionRep)

        et donc je voudrais le comparer avec les identifiants de dicoDonnee pour que lorsque il arrive sur la valeur 1 , la pastille de la cellule dans mon tableView , sera verte et non rouge.(de même pour la question dont l'identifiant vaut 2)


        Voilà donc je sais pas vraiment comment faire, car mon dicoDonneQuestionRep ne fera jamais la même taille que le second, à part si le joueur a répondu à toutes les question.

        Merci d'avance et Si c'est confus, faite moi savoir =) 

        • Partager sur Facebook
        • Partager sur Twitter
          3 juin 2013 à 10:12:04

          Oui donc comme dit dans mon précédent message, une solution serait de lire toute les réponses, mettre chaque NSDictionnary dans un NSArray, créer une méthode qui renvoie un boolean pour savoir si la question a été répondue. Et pour le savoir tu parcours le NSArray, pour chaque dico tu tente un objectForKey, si le retour est nil, tu passe au dico suivant, si il ne l'est pas, tu renvoie YES. 

          Et à la fin de la boucle, tu renvoie NO. Car il arrivera là uniquement si il n'a pas trouvé l'ID dans toutes les réponses.

          • Partager sur Facebook
          • Partager sur Twitter
            3 juin 2013 à 15:00:58

            j'essaye de faire sa mais je n'y arrive pas vraiment , voici mon code : 

            -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
            {
                UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell_Question"];
                
                DicoDonnee = self.jsonData[indexPath.row];
             
                cell.textLabel.text = DicoDonnee[@"nom_question"];
                cell.detailTextLabel.text = @"Go !";
                
                bool is = [self questionRep:DicoDonnee[@"id_question"]];
              
                   if(is == true)
                {
                    cell.imageView.image =
                    cell.imageView.image = [UIImageimageNamed:[NSStringstringWithFormat:@"isAnswer.png"]];
                }else{
                
                cell.imageView.image = [UIImageimageNamed:[NSStringstringWithFormat:@"isNotAnswer.png"]];
                }
               
                
                    return cell;
                
               
            }
            -(BOOL)questionRep:(NSString*)id_de_la_question {
             
                NSString*idQuestionRep;
                NSLog(@"%@",[self.jsonDataQuestionRepvalueForKey:@"idQuestion_questRep"]);
                for ( int i = 0 ; i < [dicoQuestionRep count];i++)
                {
                    idQuestionRep = dicoQuestionRep[@"idQuestion_questRep"];
                   
                    if(id_de_la_question == idQuestionRep)
                    {
                        return true;
                    }
                    
                }
                    
                return false;
            }
             



            -
            Edité par tralala34 3 juin 2013 à 15:01:55

            • Partager sur Facebook
            • Partager sur Twitter
              3 juin 2013 à 17:14:42

              Un message d'erreur? Qu'est-ce qui ne va pas?
              • Partager sur Facebook
              • Partager sur Twitter
                3 juin 2013 à 17:23:02

                j'ai cette erreur la :


                [__NSCFArray objectForKeyedSubscript:]: unrecognized selector sent to instance 0x890e310

                2013-06-03 17:21:04.921 La grotte aux enigme[40263:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray objectForKeyedSubscript:]: unrecognized selector sent to instance 0x890e310'

                *** First throw call stack:

                (0x15b3012 0x12c0e7e 0x163e4bd 0x15a2bbc 0x15a294e 0x850d 0x8227 0x2bf8fb 0x2bf9cf 0x2a81bb 0x2b8b4b 0x2552dd 0x12d46b0 0x11efc0 0x11333c 0x113150 0x910bc 0x92227 0x928e2 0x157bafe 0x157ba3d 0x15597c2 0x1558f44 0x1558e1b 0x26147e3 0x2614668 0x204ffc 0x249d 0x23c5)

                libc++abi.dylib: terminate called throwing an exception

                (lldb) 

                Sur la ligne :

                  idQuestionRep = dicoQuestionRep[@"idQuestion_questRep"];


                qui se trouve dans la fonction que j'ai écrite.

                • Partager sur Facebook
                • Partager sur Twitter
                  3 juin 2013 à 21:57:34

                  dicoQuestionRep est un NSArray?

                  Si oui tu dois faire plutôt du genre:

                  NSDictionnary *dict = [dicoQuestionRep objectAtIndex:i];
                  idQuestionRep = dict[@"idQuestion_questRep"];





                  -
                  Edité par delta01 3 juin 2013 à 21:59:10

                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 juin 2013 à 9:14:52

                    Alors dicoQuestionREP et un NSDictionnary , mais j'ai un NSArray aussi self.jsonDataQuestionRep , et donc j'ai remplacé et fait sa : 

                    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
                    {
                        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell_Question"];
                        
                        DicoDonnee = self.jsonData[indexPath.row];
                     
                        
                        cell.textLabel.text = DicoDonnee[@"nom_question"];
                        cell.detailTextLabel.text = @"Go !";
                        
                        bool is = [self questionRep:DicoDonnee[@"id_question"]];
                    
                     
                        
                        if (is) {
                            
                      
                            cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"isAnswer.png"]];
                        }
                        else {
                            cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"isNotAnswer.png"]];
                    
                        }
                           
                            
                    return cell;
                        
                       
                    }
                    -(BOOL)questionRep:(NSString*)id_de_la_question {
                    
                        NSString*idQuestionRep;
                       
                        for ( int i = 0 ; i < [dicoQuestionRep count];i++)
                        {
                            NSDictionary *dict = [self.jsonDataQuestionRep objectAtIndex:i];
                            idQuestionRep = dict[@"idQuestion_questRep"];
                            NSLog(@"%@",idQuestionRep);
                            if(id_de_la_question == idQuestionRep)
                            {
                                return true;
                            }
                            
                        }
                            
                        return false;
                    }

                    et là , aucune erreur à apparait mais rien ne se passe , les pastilles sont toutes rouge, alors qu'il il y a deux question qui sont répondu. ( je le voit en faisant un NSLog de idQuestionRep) 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 juin 2013 à 16:33:13

                      Je re Post car, mon problème est enfin résolue, et sa fonctionne très bien=) , alors voici mon code pour ceux qui serait tomber dans le même problème que moi =) 

                      -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
                      
                      {
                      
                          UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell_Question"];
                      
                          DicoDonnee = self.jsonData[indexPath.row];
                      
                          cell.textLabel.text = DicoDonnee[@"nom_question"];
                          cell.detailTextLabel.text = @"Go !";
                       
                          bool is = [self questionRep:DicoDonnee[@"id_question"]];
                      
                       
                          if (is = true) {
                              cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"isAnswer.png"]];
                          }
                          else {
                      
                              cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"isNotAnswer.png"]];
                          }
                      
                      return cell;
                      }
                      
                      -(BOOL)questionRep:(NSString*)id_de_la_question {
                      
                          for ( int i = 0 ; i < [self.jsonDataQuestionRep count];i++)
                          {
                      
                             NSLog(@"%@ = ",self.jsonDataQuestionRep[i][@"idQuestion_questRep"]);
                             NSLog(@"%@",id_de_la_question);
                      
                              if([id_de_la_question isEqualToString self.jsonDataQuestionRep[i][@"idQuestion_questRep"]])
                              {
                                  return true;
                              }
                          }
                       
                          return false;
                      }



                      -
                      Edité par tralala34 4 juin 2013 à 16:33:40

                      • Partager sur Facebook
                      • Partager sur Twitter

                      [IOS] Comparaison NSDictionnary pour TableView

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown