Ajouts dans une NSOutlineView
muqaddar
Administrateur
Yop,
J'ai créé une outineView que je charge à partir d'un plist. Pas de pb.
Bien sûr, je veux ajouter des éléments dans cette putlineView à 2 dimensions (groupes et sous-groupes).
En sélectionnant, une ligne et avec InsertObject, ça marche, ça m'ajoute mes éléments au bon endroit.
Maintenant 2 soucis :
1) si aucune ligne n'est sélectionnée, ça ne marche pas malgré un test que je fais
2) comment on ajoute des éléments dans le sous-groupe ?
Mon code :
J'ai bien sûr implémenter les 5 méthodes datasource pour outlineView.
J'ai créé une outineView que je charge à partir d'un plist. Pas de pb.
Bien sûr, je veux ajouter des éléments dans cette putlineView à 2 dimensions (groupes et sous-groupes).
En sélectionnant, une ligne et avec InsertObject, ça marche, ça m'ajoute mes éléments au bon endroit.
Maintenant 2 soucis :
1) si aucune ligne n'est sélectionnée, ça ne marche pas malgré un test que je fais
2) comment on ajoute des éléments dans le sous-groupe ?
Mon code :
- (IBAction)addGroup:(id)sender<br />{<br /> int index;<br /> if (![groupsTable selectedRow]) {<br /> index=[groupsArray count]-1;<br /> }<br /> else index = [groupsTable selectedRow];<br /> <br /> [groupsArray insertObject:[self createGroup] atIndex:index];<br /> [groupsTable reloadData];<br />}<br /><br />-(NSDictionary *)createGroup<br />{<br /> NSMutableDictionary *group = [NSMutableDictionary dictionary];<br /> [group setObject:[newGroupField stringValue] forKey:@"Group"];<br /> return group;<br />}<br />
J'ai bien sûr implémenter les 5 méthodes datasource pour outlineView.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
là , tu testes si la 1ère rangée est sélectionnée, pas si aucune rangée n'est sélectionnée... (les nos. de rangées commencent à 0)
donc à remplacer par:
je regarde pour la suite, ça demande un peu de réflexion...
tu pourrais faire comme suit:
- si aucun élément n'est sélectionné, créer un nouveau groupe
- si un groupe est sélectionné, mais qu'il est fermé, créer un nouveau groupe
- si un groupe est sélectionné, mais qu'il est ouvert, créer un nouveau sous-groupe dans ce groupe
- si un sous-groupe est sélectionné, créer un nouveau sous-groupe dans le même groupe
bon, bien sûr c'est pas testé... m'enfin ça pourrait être quelque chose comme ça...
Je teste et améliore si besoin est tout ça, et je reviens à la charge.
Chapeau pour cette aide précieuse.
au fait, petite modif:
ajoute dans - (IBAction) addGroup: (id) sender:
et remplace:
par:
ça devrait aller mieux...
D'abord :
isItemExpanded réclame un item, et je suis pas sûr que ce qui suit soit bon...
Ensuite, le enumerator que tu m'as fait ajouter sans boucle ??? kesako ?
Puis, le MutableArray array dans createGroup :
Jamais vu encore [NSMutableArray array] ? C'est un tableau vide ? Pas de pointeur ?
Même chose ds createSubGroup :
Je comprends pas bien ce qu'il faut mettre ds cette dernière fonction... on devrait s'occuper que des childs... Je sais pas si c'est bon.
Je remets le tout :
combien y a-t'il de niveaux de sous-groupes ?
c'est-à -dire, les sous-groupes peuvent-ils avoir des sous-groupes ?
A vrai dire, je comprends pas qu'on ait besoin de 2 méthodes createGroup et createSubGroup. Il suffit juste de lui faire comprendre dans quel niveau on est non ?
à bientôt pour le tout débuggé
(à adapter bien sûr)
si tu as des questions n'hésite pas...
ça a l'air de marcher sauf un cas : sous-groupe sélectionné. J'ai droit à une sigEnv 11.
donc ici, fuite mémoire ?
Merci de m'avoir pris par la main ! Pas simple ces OutlineView !
d'où l'intérêt d'utiliser des #define, comme ça le compilateur s'en rend compte...
T'as pas ce pb chez toi ?
Qd je mets ces lignes en comments, pas de plantage :
index = [subGroupsArray indexOfObject: subGroup] + 1;
[subGroupsArray insertObject: [self createGroup: [newGroupField stringValue] isSubGroup: YES] atIndex: index];
Je sais pas si t'as vu , j'ai édité le message de dessus.
tu pourrais séparer cette partie en plusieurs lignes et mettre un point d'arrêt juste avant, puis d'avancer pas à pas en vérifiant à chaque pas le contenu des variables...
[Fichier joint supprimé par l'administrateur]
subGroupsArray = [group objectForKey: @Childs];Â :-\
En revanche t'as remarqué que ça créait une flêche pour le nouveau groupe, même quand il n'y a rien à l'intérieur ?
ça vient du array de Childs... logique. Si je l'enlève, plus de flêche, mais on ne plus déplier le groupe donc on ne peut ajouter de sous groupe.
En fait, j'initialise mon outlineView avec un plist. Celui-ci a un groupe qui ne peut être modifié (1 seul niveau), 1 groupe avec 4 sous-niveaux non modifiable, et 1 groupe à sous-niveaux modifiable. Ensuite on peut rajouter ce qu'on veut et autant de groupes ailleurs.
Va falloir gérer ça... mais je me demande si je complique pas trop pour mes besoins. Après tout un tableView comme dans AdressBook, avec 5 groupes par défaut aurait p-e suffit... Au moins j'apprends les outlines view.
pour gérer ça tu pourrais ajouter un couple clé/valeur à chaque groupe et sous-groupe, indiquant s'il a le droit d'être modifié, et dans le selectionChanged du delegate, rendre le bouton 'ajouter' (in)disponible en fonction de la valeur qu'a cette clé pour l'élément sélectionné. comme ça pas besoin de modifier le contenu de addGroup, ça serait géré en amont.
bon courgage pour la suite !Â
Encore merci pour tout cbrandt.