[Contourné, pas résolu] Problème de synchronisation NSTreeController - Model

Philippe49Philippe49 Membre
avril 2008 modifié dans API AppKit #1
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



#import &lt;Cocoa/Cocoa.h&gt;<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:@&quot;%.*s%@&#092;n&quot;,2*level,&quot;..........................................&quot;, 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 &#092;<br />	fprintf(stderr,&quot;&#092;n==================&#092;n%s&#092;n&quot;,[[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:@&quot;Root&quot;];	<br />	NSTCNode * nodeA=[[NSTCNode alloc] initWithTitle:@&quot;A&quot;];<br />	NSTCNode * nodeB=[[NSTCNode alloc] initWithTitle:@&quot;B&quot;];<br />	[[root mutableChildNodes] addObjectsFromArray:[NSArray arrayWithObjects:nodeA,nodeB,nil]];<br />	NSTreeController * treeController=[[NSTreeController alloc] init] ;<br />	[treeController setContent:root];<br />	[treeController setChildrenKeyPath:@&quot;childNodes&quot;]; <br />	LOGTREE;<br />	<br />	NSTCNode * nodeC=[[NSTCNode alloc] initWithTitle:@&quot;C&quot;];<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 />}


Réponses

  • Philippe49Philippe49 Membre
    avril 2008 modifié #2
    Indice complémentaire :
    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]
  • Philippe49Philippe49 Membre
    14:30 modifié #3
    Bon si il est pas fils de root, il faut faire :
      [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


    #define LOGTREE &#092;<br />	fprintf(stderr,&quot;&#092;n==================&#092;n%s&#092;n&quot;,[[root treeDescriptionWithLevel:0] UTF8String]);&#092;<br />	fprintf(stderr,&quot;%d children for root&#092;n&quot;,[[root childNodes] count]);<br />
    



  • Philippe49Philippe49 Membre
    avril 2008 modifié #4
    Evidemment comme cela ça marche :
    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 ..


  • Philippe49Philippe49 Membre
    14:30 modifié #5
    La preuve que ça marche dans la mini-appli ci-jointe, mais cela reste illogique de ne pas pouvoir utiliser les méthodes insertObject: atArrangedObjectPaths:

Connectez-vous ou Inscrivez-vous pour répondre.