Utilisation des UISegmented Control pour trier un UITableView

Bonjour messieurs, j'ai besoin de vos lumières concernant le moyen de filtrer un NSMutableArray.


 


Pour le contexte, je récupère des contacts à  l'aide d'une requête JSON que je stocke dans un NSMutableArray.


 


Je les affiche ensuite dans un UITableView, jusque là  rien de vraiment compliqué.


Ensuite après quelques recherches j'ai pu à  l'aide de NSPredicate filtrer mon NSMutableArray lors d'un clique.


 


J'utilise en fait un UISegmented Control avec 4 segments, 4 boutons donc.


 


Pour chaque segment, le NSPredicate est différent.


 


Par exemple le segment 1 ne va afficher que les Contacts de type "Entreprise" etc...


 


J'arrive à  correctement filtrer mon Array car lorsque j'affiche le count de mon Array il diffère.


Néanmoins je n'arrive pas à  afficher les contacts de cet Array. J'imagine que je ne fais pas le lien avec l'Array filteredListContacts mais je ne sais pas comment m'y prendre pour le faire.


 


Merci d'avance pour votre aide.


Réponses

  • Faut que fasse un tatableview reloadData une fois l'array filtrée




  • Bonjour messieurs, j'ai besoin de vos lumières concernant le moyen de filtrer un NSMutableArray.


     




     


     


    Euh... Bon bah, tant pis, je ne peux pas répondre !!!  >:D


     


    Sinon, si tu poste le code que tu as essayé, ce sera plus simple de t'aider...  

  • @Geoffrey


     


    J'effectue déjà  un reload data de mon tableView mais le problème c'est que j'affiche par défaut listContacts, et que je sauvegarde avec un NSPredicate mes contacts filtré dans filteredListContacts.


     


    J'ai donc deux Array à  afficher. A moins qu'il soit possible de le faire avec un seul array et de revenir à  l'original lorsqu'on retire le filtre ?


     


    @Alf1996 Haha désolé :p.


     


    Voici ce que j'ai fais :



    NSMutableArray * listContacts;
    NSMutableArray * filteredListContacts;

    J'ai une méthode qui récupère les contacts et je reload mon tableau ce qui affiche l'ensemble de mes contacts.

    [listContacts addObject:monContact];
    [_tableView reloadData];

    Méthode qui filtre selon le segment sélectionné :

    - (IBAction)selectChoice:(id)sender {

    [self filterContentForFilters:[self.segmentedControl selectedSegmentIndex]];

    [_tableView reloadData];

    NSLog(@%lu,(unsigned long)[filteredListContacts count]);

    }

    Voici ma méthode de filtre

    /*
    Implementing Search Filter
    */
    - (void)filterContentForFilters:(NSInteger)scope
    {


    // Update the filtered array based on the search text and scope.
    // Remove all objects from the filtered search array
    [filteredListContacts removeAllObjects];
    // Filter the array using NSPredicate
    NSArray *tempArray = listContacts;

    NSLog(@%ld,(long)scope);

    if (scope ==0) {
    // Further filter the array with the scope
    NSPredicate *scopePredicate = [NSPredicate predicateWithFormat:@isCompany == 0];
    tempArray = [tempArray filteredArrayUsingPredicate:scopePredicate];
    }
    else if (scope ==1) {
    // Further filter the array with the scope
    NSPredicate *scopePredicate = [NSPredicate predicateWithFormat:@isCompany == 1];
    tempArray = [tempArray filteredArrayUsingPredicate:scopePredicate];
    }
    else if (scope ==2) {
    // Further filter the array with the scope
    NSPredicate *scopePredicate = [NSPredicate predicateWithFormat:@isCustomer == 1];
    tempArray = [tempArray filteredArrayUsingPredicate:scopePredicate];
    }
    else if (scope ==3) {
    // Further filter the array with the scope
    NSPredicate *scopePredicate = [NSPredicate predicateWithFormat:@isSupplier == 1];
    tempArray = [tempArray filteredArrayUsingPredicate:scopePredicate];
    }

    filteredListContacts = [NSMutableArray arrayWithArray:tempArray];

    }

    Enfin mon UITableView, je pense que le problème vient de là 

    /*
    is called every time when a table row is displayed
    */
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    static NSString *simpleTableIdentifier = @SimpleTableCell;
    SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    Contact * mContact;

    if (cell == nil)
    {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@SimpleTableCell owner:self options:nil];
    cell = [nib objectAtIndex:0];
    }

    cell.viewAvatar.layer.cornerRadius = cell.viewAvatar.frame.size.width / 2;
    cell.viewAvatar.clipsToBounds = YES;

    if([self.segmentedControl isSelected]){
    NSLog(@OK ! %lu,(unsigned long)[filteredListContacts count]);
    }

    if (tableView == self.searchDisplayController.searchResultsTableView || [self.segmentedControl isSelected]) {
    mContact =[filteredListContacts objectAtIndex:indexPath.row];
    } else {
    mContact =[listContacts objectAtIndex:indexPath.row];
    }

    cell.labelName.text = [mContact name];
    cell.labelFunction.text = [mContact function];
    if([[mContact parent] length]>0)
    cell.labelFunction.text = [NSString stringWithFormat:@%@ at %@", [mContact function], [mContact parent]];

    cell.viewAvatar.image = [self decodeImageString:[mContact picture]];
    cell.labelSales.text= @"";
    cell.labelPurchases.text= @"";


    if([mContact isCompany] == 1){

    if([[mContact opportunity_count]integerValue]>0)
    cell.labelFunction.text = [NSString stringWithFormat:@%@ opportunity", [mContact opportunity_count]];

    if([[mContact purchase_order_count] integerValue]>0 && [[mContact sale_order_count] integerValue]>0){
    cell.labelPurchases.text = [NSString stringWithFormat:@%@ purchases", [mContact purchase_order_count]];
    cell.labelSales.text = [NSString stringWithFormat:@%@ sales", [mContact sale_order_count]];

    }
    else
    if([[mContact sale_order_count] integerValue]>0)
    cell.labelPurchases.text = [NSString stringWithFormat:@%@ sales", [mContact sale_order_count]];
    }


    return cell;
    }

  • Ca doit être possible avec un seul array (je pense mais pas sur).


     


    Avec 2 arrays :


    Tu déclares un booleen : BOOL filteredTable;


     


    Et dans tes méthodes de datasource du la tableview (numberOfRowsInSection, etc...) tu regarde dans quel cas tu es, si t'es filtered, t'utilise ton 2e array, sinon le premier.


     


    Et dans ton action de changevalue du segmented control tu positionne le boolean comme il faut.


  • AsKaAsKa Membre
    décembre 2014 modifié #6

    C'est parfait, ça fonctionne très bien :)


     


    Merci pour ton aide, je suis désormais face à  un autre souci ; savez-vous comment faire en sorte de désélectionner le segment si il est sélectionné deux fois ?


  • [menu setSelectedSegmentIndex:UISegmentedControlNoSegment]; un truc comme ca ?




  • C'est parfait, ça fonctionne très bien :)


     


    Merci pour ton aide, je suis désormais face à  un autre souci ; savez-vous comment faire en sorte de désélectionner le segment si il est sélectionné deux fois ?




     


    ???


    Il ne peut y avoir qu'un segment sélectionné... Sinon pour en sélectionner un par défaut, même code que Geoffrey.

  • Je me suis mal exprimé, je veux dire ; si on clique sur un segment qui est déjà  sélectionné. Est-il possible de faire en sorte de désélectionner le segment et d'afficher la liste originale.


     


    [menu setSelectedSegmentIndex:UISegmentedControlNoSegment];


     


    Oui c'est exactement ça, j'étais tombé dessus également en effectuant mes recherches, cependant je n'arrive pas à  gérer l'événement.


  • Le premier segmented control correspond à  "aucun filtre" ?


  • Non justement, au début aucun filtre n'est sélectionné, ensuite je clique "Company", j'aimerais lors d'un second clic sur "Company" revenir à  l'état aucun filtre n'est sélectionné.


  • valuedidchange n'est pas appelé quand tu reclique sur l'onglet sélectionné ?


  • Merci pour la solution Geoffrey :)


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