[Résolu] Supprimer cell inutile dans UITableView

iMacodeiMacode Membre
septembre 2013 modifié dans API UIKit #1

Bonjour,


 


J'aimerais de l'aide par rapport à  la suppression de cell inutile dans une TableView. Je m'explique :


 


Je suis entrain de réaliser une application étudiante pour la gestion du planning des étudiants. Un coup d'oeil sur leur iPhone et il voit ce qu'ils ont dans la journée.


 


Pour cela, je récupère des données json que je met dans un MutableArray que je transforme ensuite en NSDictionnary afin de récupérer les élèments facilement avec les id.


 


Cependant, je dois afficher les cours où l'étudiant est inscrit seulement (une autre partie de l'application consiste à  permettre l'inscription aux cours).


 


Voici mon code du TableView :



-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [json count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIndentifier = @Cell;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIndentifier];
if (cell == nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIndentifier];
}
NSDictionary *planning = [json objectAtIndex:indexPath.row];
NSString *cours_conf = [planning objectForKey:@register_student];
NSInteger register_cours_conf = [cours_conf intValue];
NSString *susie = [planning objectForKey:@subscribed];
NSInteger register_susie = [susie intValue];
if (register_cours_conf == 1){
cell.textLabel.text = [planning objectForKey:@acti_title];
cell.detailTextLabel.text = [planning objectForKey:@start];
}else if (register_susie == 1){
cell.textLabel.text = [planning objectForKey:@title];
cell.detailTextLabel.text = [planning objectForKey:@start];
}
return cell;
}

Et voici l'un des résultats obtenue après le tri :


 


screen.png


 


Comme on le remarque, ça n'est pas très jolie. J'aimerais donc savoir comme il est possible de supprimer les cellules non utilisées par le TableView ?


 


Merci d'avance.


Mots clés:

Réponses

  • CéroceCéroce Membre, Modérateur

    On ne supprime pas les cellules, on ne les crée pas.


    En gros, le problème est que tu crées la tableview par rapport au NSArray json, alors que tu devrais d'abord filtrer le NSArray, ensuite la construire à  partir du NSArray filtré.


     


    D'ailleurs, je comprends que tu veuilles faire vite, mais il manque clairement une couche Modèle à  ton application. En respectant l'architecture MVC, ta question n'a pas de raison d'être. 


  • Parler de "cellules non utilisées" n'a pas tellement de sens. Il faut que tu gère ça au niveau de ton data source et donc de ton modèle.


  • Am_MeAm_Me Membre
    mai 2013 modifié #4

    Bah normalement si tu supprime les elements de ta NSMutableArray et que tu fais un tableview refresh ca devrai tles enlever


    Ou je suis a cote de la plaque


  • D'accord, je dois donc parser le NSArray. Mais pouvez me dire comment dans un NSArray je peux comparer les valeurs ?


     


    Je m'explique, mon json est de ce type :


     


    [{


    "title":"toto",


    "date":"2013-05-24",


    "register":true


    },


    {


    "title":"tata",


    "date":"2013-05-24",


    "register":false


    }]


     


    Si je trie le NSArray, je ne peux me déplacer que avec objectAtIndex, je me trompe ? Et donc, je ne peux me déplacer que d'évènement en évènement, et donc je ne peux pas vérifier les valeurs "register" ?


     


    C'est pour cela que je parais le NSDictionnary, pour pouvoir directement appeler la clé "register".


  • Tu peux très bien remplir un NSArray avec des dictionnaires. Après je ne vois pas bien ce que tu entends par "comparer les valeurs".


  • Par comparer les valeurs j'entends de savoir si "register" est à  true ou false. Mais j'ai trouvé en faisant comme ceci [[json objectAtIndex:0] objectForKey:@register];


     


    Maintenant, j'aimerais savoir comment remplir mon nouveau tableau (oui je suis débutant -.-).


     


    Je me demande si il est possible de faire ça :



    while (i < [json count]){
    NSString *cours_conf = [[json objectAtIndex:i] objectForKey:@register_student];
    NSInteger register_cours_conf = [cours_conf intValue];
    NSString *susie = [[json objectAtIndex:i] objectForKey:@subscribed];
    NSInteger register_susie = [susie intValue];
    if (register_cours_conf == 1 || register_susie == 1){
    [json2 objectAtIndex:j] = [json objectAtIndex:i];
    j++;
    }
    i++;
    }

    Ainsi, selon mon idée, le json2 aura seulement les valeurs de json correspondant à  ma recherche ?


  • Il me semble que tu trouveras sur ce forum tout un tas de sujet traitant du parse JSON et de l'interface avec une UITableView. Cela a été abordé plusieurs fois.

  • AliGatorAliGator Membre, Modérateur

    Je pense que tu as quelques concepts à  intégrer... en particulier on ne fait pas "[json2 objectAtIndex:j] = [json objectAtIndex:i];" ça marche pas comme ça...


  • C'est bon, ce que je voulais faire fonctionne. Merci pour l'aide de certains, et de la mauvaise fois d'autres.


  • Am_MeAm_Me Membre
    mai 2013 modifié #11


    C'est bon, ce que je voulais faire fonctionne. Merci pour l'aide de certains, et de la mauvaise fois d'autres.




     


    Sympa la fin ca donne envie de t'aider


     


    MAJ : Et si tu mettait résolu dans le titre ca aiderai bien plus qu'une personne :) au lieu de parler de mauvais fois :D




  • C'est bon, ce que je voulais faire fonctionne. Merci pour l'aide de certains, et de la mauvaise fois d'autres.




     


    Je ne sais pas de qui tu veux parler quand tu évoques de la mauvaise fois... et je m'en moque, mais tu peux déjà  être sûr que si quelqu'un s'est senti visé, il ne répondra pas de si tôt à  une de tes futures questions ! En tout cas, moi c'est ce que je ferais.


    N'oublie pas qu'ici les gens sont entièrement bénévoles et répondent parce qu'ils aiment aider les autres.


    Sur ce bon dev !

Connectez-vous ou Inscrivez-vous pour répondre.