bug datasource

muqaddarmuqaddar Administrateur
22:42 modifié dans Vos applications #1
Salut,

J'ai un pb sur une tableView.

-[NSConstantString objectForKey:]: selector not recognized

et
*** malloc[2047]: Deallocation of a pointer not malloced: 0xbfffe1a0; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug

Ceci se passe dès que je connecte le datasource de mon array ds IB...

P-e un pb d'initilialisation du tableau :
skinsArray = [[NSMutableArray alloc] initWithObjects:@"skin1", @"name", @"skin2",  @"name", nil];


Je me mélange les pinceaux ?

Réponses

  • cbrandtcbrandt Membre
    22:42 modifié #2
    je suis sûr que tu utilises objectForKey: [tablecolumn identifier] dans ton tableview:objectfortablecolumn....
  • muqaddarmuqaddar Administrateur
    22:42 modifié #3
    Oui comme toujours....

    Et où est le soucis là  ? ;)
  • cbrandtcbrandt Membre
    22:42 modifié #4
    ben oui...
    dans le init tu crées un array de string, alors que tu accèdes à  un dictionnaire...

    ou bien tu crées un array de dico, ou alors tu renvoies la string directement..
  • ChachaChacha Membre
    22:42 modifié #5
    dans 1112169089:

    Je me mélange les pinceaux ?


    Je pense que oui, mais c'est pas sûr.
    Voilà  : la grosse puissance de la nstableview, c'est de réussir à  séparer complètement interface et données grâce au delegate et à  la datasource.
    Le datasource, c'est un objet qui répond aux messages "combien y'a-t-il d'objets" et "quel est le ième objet" ?
    Donc même si tes données sont stockées dans un tableau, ce tableau n'est pas un bon candidat à  être datasource, car il ne dispose pas des méthodes requises (numberOfRowsInTableView, objectValueForTableColumn:row:)
    Pour se simplifier la vie, on peut donc faire le lien avec un NSArrayController. C'est ce que tu as fait ? Parce que je n'ai pas bien compris d'où tu sors le datasource dans IB

    [edit]
    grilled
    [/edit]
  • muqaddarmuqaddar Administrateur
    22:42 modifié #6
    dans 1112170228:

    ben oui...
    dans le init tu crées un array de string, alors que tu accèdes à  un dictionnaire...

    ou bien tu crées un array de dico, ou alors tu renvoies la string directement..


    Oui, je crée un array de dico... je pensais que le datasource pour uen tableView était devin sans les dicos... ;)
  • muqaddarmuqaddar Administrateur
    22:42 modifié #7
    J'ai un autre soucis les jeun's.

    Exception raised during posting of notification.  Ignored.  exception: *** -[NSCFNumber stringByDeletingPathExtension]: selector not recognized
    2005-03-30 14:36:49.173 iMa[3104] selecteID : 3
    2005-03-30 14:36:49.174 iMa[3104] *** -[NSCFNumber stringByDeletingPathExtension]: selector not recognized

    Apparemment un pb de notification ds ma méthode delegate.
    Pourtant, lorsque je fais le NSLog selecteID, il me renvoie bien la valeur de ma ligne. Kesako encore ?

    Autre chose : peut-on récupérer la valeur d'une cellule s'il n'est pas ds la tableView mais seulement dans l'array et ses dicos qui servent de datasource.

    Ex :
    - (void)tableViewSelectionDidChange:(NSNotification *)aNotification
    {
    NSTableView* tableView = [aNotification object];
    NSString* selectedId = [NSString string];

    if ([tableView selectedRow] != -1) {
    NSString* selectedId = tableView dataSource] tableView:tableView objectValueForTableColumn:[[[NSTableColumn alloc] initWithIdentifier:@"id"] autorelease] row:[tableView selectedRow;
    NSLog (@selecteID : %@", selectedId);
    }

    où je n'affiche que la clé name dans le tableau mais pas id.
  • fouffouf Membre
    22:42 modifié #8
    Je pense (pas sur, comme d'habitude vous allez me dire), qu'il s'agit du même pd que précédemment. Quand et où utilises-tu la méthode stringByDeletingPathExtension ?
  • muqaddarmuqaddar Administrateur
    22:42 modifié #9
    Je l'utilise pas....
  • cbrandtcbrandt Membre
    mars 2005 modifié #10
    dans 1112186441:

    Exception raised during posting of notification.  Ignored.  exception: *** -[NSCFNumber stringByDeletingPathExtension]: selector not recognized
    2005-03-30 14:36:49.173 iMa[3104] selecteID : 3
    2005-03-30 14:36:49.174 iMa[3104] *** -[NSCFNumber stringByDeletingPathExtension]: selector not recognized

    lance ton appli dans le debugger, mets-là  en pause, puis tapes dans le debugger:
    br [NSException raise]
    et cliques sur 'continue'
    ton appli va s'arrêter dans le debugger et tu verras dans la pile l'appel à  stringByDeletingPathExtension et surtout d'où il vient...


    dans 1112186441:

    Autre chose : peut-on récupérer la valeur d'une cellule s'il n'est pas ds la tableView mais seulement dans l'array et ses dicos qui servent de datasource.

    Ex :
    - (void)tableViewSelectionDidChange:(NSNotification *)aNotification
    {
    NSTableView* tableView = [aNotification object];
    NSString* selectedId = [NSString string];

    if ([tableView selectedRow] != -1) {
    NSString* selectedId = tableView dataSource] tableView:tableView objectValueForTableColumn:[[[NSTableColumn alloc] initWithIdentifier:@"id"] autorelease] row:[tableView selectedRow;
    NSLog (@selecteID : %@", selectedId);
    }

    où je n'affiche que la clé name dans le tableau mais pas id.


    c'est un beau sac de noeuds, ça !! et comme ça ?
    <br />rowIndex = [tableView selectedRow]<br />if (rowIndex != -1)<br />&nbsp; &nbsp; selectedID = [[skinsArray objectAtIndex: rowIndex] objectForKey: @&quot;id&quot;];<br />
    
  • muqaddarmuqaddar Administrateur
    mars 2005 modifié #11
    Salut,

    Alors me revoilà . ;)

    selectedID = [[skinsArray objectAtIndex: rowIndex] objectForKey: @&quot;id&quot;];
    

    ne donne pas le selectedID, il le reconnait pas !

    En revanche, ce que j'avais écrit :

    NSString* selectedId = [[tableView dataSource] tableView:tableView objectValueForTableColumn:[[[NSTableColumn alloc] initWithIdentifier:@&quot;id&quot;] autorelease] row:[tableView selectedRow]];
    

    me donne bien l'id.

    Reste que si j'utilise l'id par la suite comme là  :
    [skinsImageSelected setImage: [NSImage imageNamed:selectedId]];
    

    dans une imageView, je me prend le fameux :

    Exception raised during posting of notification.  Ignored.  exception: *** -[NSCFNumber length]: selector not recognized

    Or, si j'écris ça à  la place :
    [skinsImageSelected setImage: [NSImage imageNamed:@1]];

    J'ai pas d'erreur... Je ne comprends pas pourquoi puisque j'envoie une string avec le premier cas également.

    EDIT : j'ai rajouté un stringValue à  ma chaà®ne et tout est rentré dans l'ordre, ça doit être parce que je reçois un Number par défaut de mon numéro de ligne de table.

    Néanmoins, j'avais essayé avec "id" à  la place de string, et j'avais eu l'erreur également, je pensais pas que imageNamed refuserait le cas "id" puisqu'il n'est pas typé.
  • cbrandtcbrandt Membre
    22:42 modifié #12
    fais voir le contenu de tableview objectvaluefortablercolumn...
  • muqaddarmuqaddar Administrateur
    22:42 modifié #13
    dans 1112259159:

    fais voir le contenu de tableview objectvaluefortablercolumn...


    2005-03-31 11:01:28.470 iMa[5341] conteu de tableview : skin1
    2005-03-31 11:01:28.473 iMa[5341] conteu de tableview : skin2 mort
    2005-03-31 11:01:28.474 iMa[5341] conteu de tableview : skin3 qui tue


    J'affiche pas les id ds le nib comme je disais plus haut. Juste la colonne name.
  • cbrandtcbrandt Membre
    22:42 modifié #14
    je voulais dire 'fais voir le code de tableview objectvaluefortablecolumn'
  • muqaddarmuqaddar Administrateur
    22:42 modifié #15
    dans 1112260300:

    je voulais dire 'fais voir le code de tableview objectvaluefortablecolumn'


    Ah ok ;)

    - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex
    {
    if (aTableView == skinsTableView) return skinsArray objectAtIndex:rowIndex] objectForKey:[aTableColumn identifier;
    }


  • ClicCoolClicCool Membre
    22:42 modifié #16
    dans 1112258694:

    Exception raised during posting of notification.  Ignored.  exception: *** -[ NSCFNumber length]: selector not recognized


    Ben il me semble que ici t'as passé à  [NSImage imageNamed:selectedId]], un objet selectedId qui n'est pas un NSString mais un NSNumber.

    C'est vrai que si tu renvoies ça à  une NSTableView elle sait en extraire la stringValue pour l'affichage mais faut pas s'attendre à  ce que imageNamed fasse pareil.

    Le pb c'est qu'avec objectForKey: il faut parfois vérifier le type d'objet récupéré ....
  • cbrandtcbrandt Membre
    22:42 modifié #17
    ... et donc je maintiens que dans
    <br />- (void)tableViewSelectionDidChange:(NSNotification *)aNotification <br />{<br />   NSTableView* tableView = [aNotification object];<br />   NSString* selectedId = [NSString string];<br />      <br />   if ([tableView selectedRow] != -1) {<br />      NSString* selectedId = [[tableView dataSource] tableView:tableView objectValueForTableColumn:[[[NSTableColumn alloc] initWithIdentifier:@&quot;id&quot;] autorelease] row:[tableView selectedRow]];<br />      NSLog (@&quot;selecteID : %@&quot;, selectedId);<br />}<br />
    


    tu peux remplacer:
    <br />      NSString* selectedId = [[tableView dataSource] tableView:tableView objectValueForTableColumn:[[[NSTableColumn alloc] initWithIdentifier:@&quot;id&quot;] autorelease] row:[tableView selectedRow]];<br />
    

    par:
    <br />    NSString *selectedID = [[skinsArray objectAtIndex: [tableView selectedRow]] objectForKey: @&quot;id&quot;];<br />
    

    puisque:
    <br />- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex<br />{ <br />   if (aTableView == skinsTableView) return [[skinsArray objectAtIndex:rowIndex] objectForKey:[aTableColumn identifier]];<br />}<br />
    
  • muqaddarmuqaddar Administrateur
    22:42 modifié #18
    C'est bon, ça marche, tu as raison Maà®tre brandt !

    Merci à  toi, ça fait moins de code.
  • 22:42 modifié #19
    Le code que tu avais mis a en fait un intérêt si pour une raison x ou y, le delegate de la table et le datasource sont des objets différents.

    (Rappelle toi: je te l'avais donné pour Vinitheca, où les datasource de différentes tables étaient indépendants du contrôleurs principal, et ces tables avaient le même délégué à  savoir le contrôleur principal)
  • muqaddarmuqaddar Administrateur
    22:42 modifié #20
    Tout à  fait. ;)
  • cbrandtcbrandt Membre
    22:42 modifié #21
    dans 1112271966:

    C'est bon, ça marche, tu as raison Maà®tre brandt !


    je vais peut-etre changer mon avatar 'Disciple' par 'Leonard'...  ;)
Connectez-vous ou Inscrivez-vous pour répondre.