Filtrer une table selon deux critères

laurrislaurris Membre
mai 2006 modifié dans API AppKit #1
Filtrer une table avec deux critères ... issus de deux éléments d'interface différents.
Je m'explique: soit une Table gérée par un TableController (NSArrayController). On peut filtrer la table en live en bindant son predicate à  la valeur d'un NSSearcField. Jusque là  fastoche.

MAIS j'ai aussi dans mon interface une matrice avec des cellules. Et chaque cellule représente une valeur particulière de la table. J'aimerais donc qu'en cliquant sur la cellule on obtienne une table filtrée à  partir de la valeur de cette cellule. Un peu moins fastoche à  réaliser, mais marche bien.

ET maintenant, j'aimerais faire les deux: soit filtrer à  partir du SearchField quand on tape du texte dedans, soit filtrer à  partir de la matrice quand on clique sur une cellule. A noter que je n'ai pas besoin de faire un double filtrage NSSearchField + matrix. Soit l'un soit l'autre en fonction de l'input.

Donc ça parait bête mais je n'y arrive pas. En effet, on ne peut pas binder un arraycontroller par son predicate à  deux éléments.
Comment faire ? Dois-je me résoudre à  débinder et rebinder la table à  chaque fois que la sélection de la matrix change ou que le texte recherché change ?

Merci pour vos lumières.



Réponses

  • MalaMala Membre, Modérateur
    06:32 modifié #2
    Je pense que le plus simple serait de ne pas passer par le binding sur ce coup.

    Moi je débinderais (ouahou!!! C'est même pas dans mon dico franglais ça... :) ). Ensuite, je créerais un action qui répond à  ma cellule et mon NSSearchField.

    Lorsque l'utilisateur clic sur l'un des deux, je le reconnais dans mon action en testant le sender.

    Ensuite, je constuit la requète via "NSPredicate" en faisant un "predicateWithFormat" avec ma chaine de filtrage que j'ai construit au préalable.

    Enfin, j'envoie ça à  mon NSArrayControler via un "setFilterPredicate"
  • laurrislaurris Membre
    mai 2006 modifié #3
    Merci mala. Je viens de le faire comme tu l'indiques et finalement ça marche bien. Je réchignais un peu à  abandonner les bindings parce que j'utilise un NSSearchField avec un menu pour limiter la recherche. Or l'avantage, quand on binde le predicate du NSSearchField,  est que le menu item correspondant se créé automagiquement. Mais refaire le mécanisme à  la main n'est pas si difficile.

    Maintenant j'ai quand même d'autres petits soucis avec ces menus mais je les garde pour un prochain topic. (Topic qui sera: "comment utiliser un NSArrayController pour gérer dynamiquement le menu d'un NSSearchField ". C'est vrai ça, comment ?).

    Au fait, voici le code si ça peut être utile. Il faut regarder dans le fichier Controller.m les méthodes
    - (IBAction)filter:(id)sender;
    - (IBAction)limitSearch:(id)sender;
    -(void)setupSearchFieldWithKeys:(NSArray*)searchKeys;

    OS 10.4 /xcode 2.2:


    [Fichier joint supprimé par l'administrateur]
Connectez-vous ou Inscrivez-vous pour répondre.