OVH Cloud OVH Cloud

[NSTableView et NSCellImage]

7 réponses
Avatar
nospam
Salut,

Je cherche à avoir une NSTable de trois colonnes. La première et la
dernière doivent contenir des images, je les aient donc déclarées comme
des NSImageCell dans IB, en glissant dessus l'icône qui correspond de la
palette Cocoa-Data.

Dans mon code, j'ai deux méthodes, qui ont le même nom que l'identifier
de chacune de ces colonnes (xRouge et fleche) qui retourne l'image en
question.

- (NSImage *)xRouge {
return ([[NSImage alloc]
initByReferencingFile:@"InvalidBadge"]);
}

Les images sont bien présentes dans le projet.

Lorsque je compile, je n'ai même pas le plus petit warning. Lorsque
j'exécute, pas de plantage. Simplement les images ne sont pas affichées.

J'ai basé mon code sur celui qui se trouve au chapitre 9 de Learning
Cocoa paru chez O'Reilly il y a bien longtemps.

J'ai merdé quelque part, mais je ne vois pas où.

Merci d'avance à celui qui sait ou qui voit.

--
Jacques

7 réponses

Avatar
ftestuz
Jacques Foucry wrote:

Salut,

Je cherche à avoir une NSTable de trois colonnes. La première et la
dernière doivent contenir des images, je les aient donc déclarées comme
des NSImageCell dans IB, en glissant dessus l'icône qui correspond de la
palette Cocoa-Data.

Dans mon code, j'ai deux méthodes, qui ont le même nom que l'identifier
de chacune de ces colonnes (xRouge et fleche) qui retourne l'image en
question.

- (NSImage *)xRouge {
return ([[NSImage alloc]
initByReferencingFile:@"InvalidBadge"]);
}

Les images sont bien présentes dans le projet.

Lorsque je compile, je n'ai même pas le plus petit warning. Lorsque
j'exécute, pas de plantage. Simplement les images ne sont pas affichées.

J'ai basé mon code sur celui qui se trouve au chapitre 9 de Learning
Cocoa paru chez O'Reilly il y a bien longtemps.

J'ai merdé quelque part, mais je ne vois pas où.

Merci d'avance à celui qui sait ou qui voit.


Il y a peu de code donné et à voir tu ne travailles pas avec les
bindings, mais vérifie :

1) tu as défini le lien dataSource de la tableView dans IB
2) l'outlet pointé par le lien dataSource doit avoir (au moins) les
méthodes :
- (int)numberOfRowsInTableView:(NSTableView *)aTableView
- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(int)rowIndex

Et aussi ta méthode xRouge retourne toujours la même image et en créé
une nouvelle à chaque fois. Pas très efficace, d'autant plus que ces
méthodes doivent être très rapide puisqu'elles sont souvent appelées.

Et en plus je crains que fait de cette manière il y ait une fuite de
mémoire.

--
Frédéric Testuz
<mailto:

Avatar
nospam
Frédéric Testuz wrote:

Il y a peu de code donné et à voir tu ne travailles pas avec les
bindings, mais vérifie :


Non, pas de bindings, je n'ai toujours pas compris comment marchait ce
truc.

1) tu as défini le lien dataSource de la tableView dans IB
2) l'outlet pointé par le lien dataSource doit avoir (au moins) les
méthodes :
- (int)numberOfRowsInTableView:(NSTableView *)aTableView
- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(int)rowIndex


Tout cela fonctionne. Si je remplace le type de mes deux colonnes par tu
texte par exemple (je les remet en defaule cell) et je renvoie une
chaîne au lieu de l'image, mon code fonctionne et j'ai bien mes trois
colonnes remplie.

Et aussi ta méthode xRouge retourne toujours la même image et en créé
une nouvelle à chaque fois. Pas très efficace, d'autant plus que ces
méthodes doivent être très rapide puisqu'elles sont souvent appelées.


C'est vrai. Je dois a charger l'image plus tôt et ne renvoyer que
celle-ci.

Ou bien tenter d'utiliser ces @#$%^&* de bindings.

--
Jacques

Avatar
luc
Jacques Foucry wrote:

Tout cela fonctionne. Si je remplace le type de mes deux colonnes par tu
texte par exemple (je les remet en defaule cell) et je renvoie une
chaîne au lieu de l'image, mon code fonctionne et j'ai bien mes trois
colonnes remplie.


Vérifie si par hasard ton [[NSImage alloc] init....] ne retourne pas nil
pour une raison ou une autre, on ne sait jamais.

--
Luc Heinrich

Avatar
pere.noel
Jacques Foucry wrote:


- (NSImage *)xRouge {
return ([[NSImage alloc]
initByReferencingFile:@"InvalidBadge"]);
}

Les images sont bien présentes dans le projet.

Lorsque je compile, je n'ai même pas le plus petit warning. Lorsque
j'exécute, pas de plantage. Simplement les images ne sont pas affichées.


perso je ne fais pas ça au niveau d'IB mais dans mon awakefromnib, et ça
roule.
--
une bévue

Avatar
nospam
Luc Heinrich wrote:

Vérifie si par hasard ton [[NSImage alloc] init....] ne retourne pas nil
pour une raison ou une autre, on ne sait jamais.


Oui, c'est bien ça.

Je n'arrive pas à charger l'image qui pourtant ce trouve dans le
répetoire du projet. Cela fonctionne lorsque je donne le chemin complet
vers l'image.

--
Jacques

Avatar
luc
Jacques Foucry wrote:

Je n'arrive pas à charger l'image qui pourtant ce trouve dans le
répetoire du projet.


Essaye plutôt [NSImage imageNamed:]. Et sinon construit le path avec
[NSBundle pathForResource:ofType:].

--
Luc Heinrich

Avatar
nospam
Luc Heinrich wrote:

Et sinon construit le path avec
[NSBundle pathForResource:ofType:].


Ouaip, bonne solution. Merci

--
Jacques