[Contourné, pas résolu] Problème de synchronisation NSTreeController - Model
Philippe49
Membre
Je crée un NSTreeController qui gère une arborescence élémentaire: Un père et deux fils A et B.
J'ajoute un troisième fils C au rang 0 dans le tableau des fils du père.
Sur un NSBrowser, cela marche : les fils sont dans l'ordre attendu CAB .
Par contre, dans le modèle, cela ne marche pas : les fils sont dans l'ordre ABC.
La structure "arrangedObjects" étant déclarée opaque (c'était il y a quinze jours ;D (aux paques)) on n'y voit rien ...
Idée ?
Exécution
% gcc pgm4.m -o pgm -framework Cocoa
% pgm
==== Initialisation ==============
Root
..A
..B
==== Insertion et observation du modèle ====
Root
..A
..B
..C
=====Observation du modèle après rearrangeObjects =============
Root
..A
..B
..C
J'ajoute un troisième fils C au rang 0 dans le tableau des fils du père.
Sur un NSBrowser, cela marche : les fils sont dans l'ordre attendu CAB .
Par contre, dans le modèle, cela ne marche pas : les fils sont dans l'ordre ABC.
La structure "arrangedObjects" étant déclarée opaque (c'était il y a quinze jours ;D (aux paques)) on n'y voit rien ...
Idée ?
Exécution
% gcc pgm4.m -o pgm -framework Cocoa
% pgm
==== Initialisation ==============
Root
..A
..B
==== Insertion et observation du modèle ====
Root
..A
..B
..C
=====Observation du modèle après rearrangeObjects =============
Root
..A
..B
..C
#import <Cocoa/Cocoa.h><br /><br /><br />@interface NSTCNode:NSTreeNode<br />{ <br /> NSString* title; <br />}<br />-(id) initWithTitle:(NSString*) aTitle ;<br />-(NSString *) treeDescriptionWithLevel:(NSInteger) level;<br />@end<br /><br />@implementation NSTCNode<br />-(id) initWithTitle:(NSString*) aTitle <br />{<br /> self = [super init];<br /> if (self != nil) {<br /> title=[[NSString alloc] initWithString: aTitle];<br /> }<br /> return self;<br />}<br />-(NSString *) treeDescriptionWithLevel:(NSInteger) level<br />{<br /> NSMutableString * descro=[NSMutableString stringWithFormat:@"%.*s%@\n",2*level,"..........................................", title];<br /> level++;<br /> for(NSTCNode * node in [self childNodes]){<br /> [descro appendString:[node treeDescriptionWithLevel:level]];<br /> }<br /> return [descro copy];<br />}<br />-(void) dealloc{<br /> [title release];<br /> [super dealloc];<br />}<br />@end<br /><br />#define LOGTREE \<br /> fprintf(stderr,"\n==================\n%s\n",[[root treeDescriptionWithLevel:0] UTF8String]);<br /><br /><br />int main(int argc, char**argv){<br /> NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];<br /> NSTCNode * root=[[NSTCNode alloc] initWithTitle:@"Root"]; <br /> NSTCNode * nodeA=[[NSTCNode alloc] initWithTitle:@"A"];<br /> NSTCNode * nodeB=[[NSTCNode alloc] initWithTitle:@"B"];<br /> [[root mutableChildNodes] addObjectsFromArray:[NSArray arrayWithObjects:nodeA,nodeB,nil]];<br /> NSTreeController * treeController=[[NSTreeController alloc] init] ;<br /> [treeController setContent:root];<br /> [treeController setChildrenKeyPath:@"childNodes"]; <br /> LOGTREE;<br /> <br /> NSTCNode * nodeC=[[NSTCNode alloc] initWithTitle:@"C"];<br /> NSIndexPath * indexPath=[[NSIndexPath indexPathWithIndex:0] indexPathByAddingIndex:0];<br /> [treeController insertObject:nodeC atArrangedObjectIndexPath:indexPath]; <br /> LOGTREE;<br /> <br /> [treeController rearrangeObjects];<br /> LOGTREE;<br /> <br /> [pool release];<br /> return 0;<br />}
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
L'index path du noe“ud inséré dans l'arbre model est de longueur nulle ?
et pourtant il est bien fils de root, sinon il ne serait pris en compte dans la description ?
NSMutableString * descro=[NSMutableString stringWithFormat:@%.*s %@ : %@\;n",2*level,"..........................................", [[self indexPath] description], title];
Exécution
% pgm
==================
<NSIndexPath 0x111520> 0 indexes [ ] : Root
.. <NSIndexPath 0x110d20> 1 indexes [ 0 ] : A
.. <NSIndexPath 0x111930> 1 indexes [ 1 ] : B
==================
<NSIndexPath 0x111520> 0 indexes [] : Root
.. <NSIndexPath 0x110d20> 1 indexes [ 0 ] : A
.. <NSIndexPath 0x111930> 1 indexes [ 1 ] : B
.. <NSIndexPath 0x111520> 0 indexes [ ] : C
==================
<NSIndexPath 0x111520> 0 indexes [] : Root
.. <NSIndexPath 0x110d20> 1 indexes [ 0 ] : A
.. <NSIndexPath 0x111930> 1 indexes [ 1 ] : B
.. <NSIndexPath 0x111520> 0 indexes [ ] : C
%
[glow=yellow,2,300]When you bind, you are blind ![/glow]
[nodeC setValue:root forKey:@parentNode];
Et alors, il devient double fils
==================
<NSIndexPath 0x111520> 0 indexes [] : Root
.. <NSIndexPath 0x110d20> 1 indexes [ 0 ] : A
.. <NSIndexPath 0x111930> 1 indexes [ 1 ] : B
.. <NSIndexPath 0x11a630> 1 indexes [ 2 ] : C
.. <NSIndexPath 0x11a630> 1 indexes [ 2 ] : C
4 children for root
NSTCNode * nodeC=[[NSTCNode alloc] initWithTitle:@C];
[[root mutableChildNodes] insertObject:nodeC atIndex:0];
LOGTREE;
[treeController setSelectionIndexPath:indexPath];
NSLog(@%@",[[treeController selectedObjects] valueForKey:@title]);
Ce qui veut dire que le [treeController setContent:root] ne déclenche pas une mise à jour bidirectionelle ?
Clic-Cool , grand bindeur (surtout avec Ferninde), si tu as un instant ..