Binding & OutlineView
belt
Membre
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...
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...
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
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.
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 !
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.