bug datasource

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 :
Je me mélange les pinceaux ?
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 ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Et où est le soucis là ?
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..
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]
Oui, je crée un array de dico... je pensais que le datasource pour uen tableView était devin sans les dicos...
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.
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...
c'est un beau sac de noeuds, ça !! et comme ça ?
Alors me revoilà .
ne donne pas le selectedID, il le reconnait pas !
En revanche, ce que j'avais écrit :
me donne bien l'id.
Reste que si j'utilise l'id par la suite comme là :
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é.
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.
Ah ok
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex
{
if (aTableView == skinsTableView) return skinsArray objectAtIndex:rowIndex] objectForKey:[aTableColumn identifier;
}
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é ....
tu peux remplacer:
par:
puisque:
Merci à toi, ça fait moins de code.
(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)
je vais peut-etre changer mon avatar 'Disciple' par 'Leonard'...