Binding & OutlineView

beltbelt Membre
juin 2006 modifié dans API AppKit #1
Bonsoir à  tous,
J'ai fait une petite appli dans le simple but d'essayer les binding avec une OutlineView (qui comporte 2 colonnes)
Ne sachant pas trop comment ça marche, j'ai défini une classe
@interface MaClasse : NSObject
{
NSString *nom1 ;
NSString *nom2 ;
NSMutableArray *table ;
}

- (NSString *)nom1;
- (void)setNom1:(NSString *)s;
- (NSString *)note2;
- (void)setNom2:(NSString *)s;
- (NSMutableArray *)table;
...
Puis j'ai ajouté dans IB une instance de NSTreeController, dans laquelle j'ai défini les clés suivantes : nom1, nom2 et table.
J'ai choisi "table" comme "children key path".
J'ai lié chaque colonne (NStableColumn) de mon OutlineView à  ma classe MaClasse à  l'aide des bindings dans IB (colonne 1 : value = arrangedObjects.nom1 et colonne 2 : value =arrangedObjects.nom2)

D'autre part, toujours dans IB, j'ai ajouté 3 boutons dans la fenêtre qui contient mon OutlineView, nommés add, add child et remove que j'ai liés aux méthodes correspondantes de mon NSTreeController.
Et ça marche ! Enfin ça semble marcher. A l'exécution, pas de problème. Par contre j'imaginais (peut être à  tort) qu'à  chaque fois que je rajoute un niveau dans la hiérarchie, un nouveau NSMutableArray est initialisé et que cocoa ajoute dans ce tableu d'objet un nouveau pointeur vers un  nouvel objet MaClasse...
Or si je debugge, je constate que table reste obstinément à  "nil". Il y a donc un pb qq part.
Qu'en pensez vous ?

D'autre part quelqu'un saurait comment utiliser les binding avec une classe NSBrowser ?
Merci par avance...

Réponses

  • AliGatorAliGator Membre, Modérateur
    04:59 modifié #2
    Salut  ;)

    J'ai déjà  un peu essayé avec NSBrowser, mais ça m'a pas l'air simple à  utiliser ce truc, surtout par rapport à  NSTableView ou NSOutlineView.

    Sinon tu as regardé dans ton NSTreeController quelle classe tu as mise pour tes instances ? Il faut que tu mettes "MaClasse" dans le champ en haut de l'inspecteur à  la place de la valeur proposée (NSMutableDictionary il me semble par défaut) pour lui dire que lorsqu'il crée des nouvelles instances (qd tu fais add ou addchild) c'est des instances de cette classe qu'il doit créer.
  • beltbelt Membre
    04:59 modifié #3
    En fait, ce qui me tracasse, c'est ce que réprésente exactement le "children key path". J'ai quelques idées à  ce sujet, mais pas de certitudes. Si Apple mettait un peu plus d'exemples dans sa doc, ça serait le bonheur !
  • AliGatorAliGator Membre, Modérateur
    04:59 modifié #4
    Le "children key path" correspond à  la clé que doit utiliser le TreeController pour récupérer le tableau des enfants.
    Donc dans ton cas c'est précisément "table" en effet, puisqu'il lui suffira de demander le keypath "table" (vu que c'est un keypath simple, il lui suffira de demander [tt]valueForKey:@table[/tt] en l'occurence) pour récupérer le tableau des enfants du noeud courant.
    Donc pour ça tu as vu juste et de ce côté là  ça devrait marcher.
  • beltbelt Membre
    04:59 modifié #5
    Bonsoir à  tous !
    Toujours dans le but de comprendre comment fonctionne les bingings avec une OutlineView, j'ai développé une petite appli Model-View-Controller.
    Mon modèle est la classe :
    @interface MaClasse : NSObject
    {
    NSString  *nom1 ;
    NSString  *nom2 ;
    NSMutableArray *table ;
    }

    J'ai sous-classé un NSTreeController de façon a y rajouter une méthode -info destinée à  afficher les NSString de mon modèle. Voici ma méthode -info :

    #import "MyTreeController.h"

    void affiche_liste( id objet )
    {
    NSEnumerator *e = [ objet objectEnumerator ] ;
    id obj ;

    while (obj = [e nextObject] )
    {
      NSLog(@%@ %@", [ obj nom1 ], [obj noim2 ] ) ;
      if ( [ obj table ] )
      affiche_liste( [ obj table ] ) ;
    }
    }

    @implementation MyTreeController

    - (IBAction)info:(id)sender
    {
    affiche_liste( [ self content ] ) ;
    }
    @end


    Bon ça marche très bien, mais il me semble que cocoa peut faire ça autrement !
    Qu'en pensez vous ?
    D'avance, merci pour vos réponses, en sachant bien que ma question déchaà®nera une cogitation communautaire de grande ampleur !

  • Eddy58Eddy58 Membre
    04:59 modifié #6
    dans 1151104360:

    Bon ça marche très bien, mais il me semble que cocoa peut faire ça autrement !
    Qu'en pensez vous ?

    Tu fais un log du content de ton TreeController, et à  part surcharger la méthode description pour rendre ça plus propre, je ne vois pour ma part rien d'autre à  ajouter. :)
Connectez-vous ou Inscrivez-vous pour répondre.