Charger des vues dans un tableau ?
muqaddar
Administrateur
Tout est dans le titre.
Est-ce possible de charger des vues dans les cellules d'un tableau ?
Si c'est possible, apparemment ça se fait par le code parce que IB a pas l'air OK...
Est-ce possible de charger des vues dans les cellules d'un tableau ?
Si c'est possible, apparemment ça se fait par le code parce que IB a pas l'air OK...
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Mais c'est extrêmement compliqué, et ça ne se fait que par programmation.
En fait, le principe est d'ajouter ta vue via un addSubview: à la NSTableView, à l'endroit précis (ligne et colonne) où cette vue doit apparaà®tre.
Que veux tu mettre comme vue ? Car il existe des alternatives plus "réalistes" :
- créer un "image" (NSImage) de ta vue pour l'ajouter au tableau via une NSImageCell.
- créer une cell spécifique à ce qu'affiche ta vue.
Ma préférée est la solution 2.
.
Je les crée avec drawRect et je voulais m'en servir pour les afficher également, en fonction du contenu d'un plist de sauvegarde (emplacement, nombre bouteilles...etc).
Maintenant, je voulais pas avoir à stocker des images, peut-on créer alors des images temporaires ? C'est à dire non gérées sur le HD, mais qui se créent à partir de drawRect uniquement en mémoire quand l'appli est lancée ?
Peut-on faire clignoter des cellules de tableaux ? (à la base, je voulais changer les couleurs de ce qui était affiché par drawRect)
Sinon, je peux p-e me passer de tableau avec des views mais ça m'oblige à créer pleins d'outlets je pense...
pour me pardonner, voici ladite nscell (pas testé, mais ça doit pas être bien loin):
.h:
et .m:
EDIT:
il faut probablement décaler l'origine de l'affichage avec la position de cellFrame:
Faut que je gère ça par NSMatrix (dixit Renaud) + sous classer NSCell
Parce que j'ai 2 types de drawRect en fait.
ça va être coton.
J'ai besoin d'aide.
Apparemment, je dois afficher mes vues dans les cellules d'une matrice.
Or j'ai jamais touché aux matrices.
Donc dans mon Bouteille.m, j'ai :
[tt]- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView*)controlView
{
NSColor *color = [[NSColor colorWithCalibratedRed:0.1 green:0.5 blue:0.2 alpha:1] set];
int i, j;
//casier rectangulaire
if (nbreBouteillesT==0) {
for (i=0; i<nbreBouteillesL; i++) {
for (j=0; j<nbreBouteillesH; j++) {
NSRect r = NSMakeRect((cellFrame.origin.x+1+(18*i)), (cellFrame.origin.x+1+(18*j)), 15, 15);
NSBezierPath *bp = [NSBezierPath bezierPathWithOvalInRect:r];
[bp setLineWidth:2];
[bp stroke];
}
}
[/tt]
Et ça je dois faire comprendre à mon controlleur qui gère la matrice de l'afficher dans les cellules de la matrice. Me fais-je comprendre ?
Ainsi dans mon controlleur, j'ai :
[tt][matrice addRowWithCells:_newCells];[/tt]
où _newCells doit être un array de cellules apparemment ?
Bon, je coince. Je rappelle que je veux afficher des instances de ma sous classe de NSCell (avec drawRect) dans les cellules de la matrice.
Epaulez moi !
- utilise - (void)addRowolumn ou - (void)addColumn pour ajouter des rangées/colonnes. après appelle - (void)sizeToCells pour redimensionner la matrice de façon à englober les cellules ajoutées et setNeedsDisplay pour raffraà®chir
- utilise - (id)cellAtRow:(int)row column:(int)column pour accéder à une cell spécifique, par ex. pour modifier ses caractéristiques.
EDIT:
tu veux une cellule par bouteille ? donc ta matrice aura largeur x hauteur nb. de cellules - dans ce cas il faut modifier ton drawInteriorWithFrame pour n'afficher qu'une bouteille...
sinon if faudra redimensionner la cellule de façon à afficher le nb. de bouteilles voulu...
on manque un peu d'infos sur ce que tu veux faire exactement
Je m'explique un peu mieux maintenant.
Ma matrice doit contenir 5 * 4 vues dans tous les cas. Après, le contenu des vues change selon les contenu d'un plist. Les vues peuvent être vides.
Chaque vue affiche des graphiques grâce à drawRect qui est appelé dans chaque cellule (donc ds chaque vue). Il y a un casier par vue (ou par cellule) qui contient x bouteilles renseignées et construites d'après les données du plist.
Voilà . J'espère que c'est un peu plus clair.
cepandant le nom de te classe prête à confusion: en fait ta classe MaBouteille devrait plutôt s'appeler MonCasier, non ? vu que une matrice contient 20 cellules (casiers), chaque casier affichant nbLargeur x nbHauteurs bouteilles ?
c'est ça ?
Je corrige ce nom et t'envoie un projet par MP (juste pour que tu regardes) qui t'aidera à comprendre.
A tout de suite.
Je n'ai trouvé que ça : addRowWithCells:
qui ajoute une ligne à chaque fois (il me suffirait de boucler) mais je suis étonné...
Si ça exite. Ca s'appelle :
[tt]- (void)renewRows:(int)newRows columns:(int)newCols[/tt]
.
"This method uses the same cells as before, creating new cells only if the new size is larger; it never frees cells."
C'ets le "creating new cells only if the new size is larger" qui m'a troublé. Je vais essayer. merci
Pourtant , j'ai fait ça avant :
[matrice renewRows:5 columns:4];
[matrice sizeToCells];
Pourquoi ça ne marche qu'avec la row 0 et column 0 ?
[(Casier*) [matrice cellAtRow:0 column:0 bouteillesPourLargeur:5 andHauteur:6];
marche, mais pas :
[(Casier*) [matrice cellAtRow:1 column:1 bouteillesPourLargeur:5 andHauteur:6];
Comment as tu créé ta NSMatrix ?
.
//configuration de la matrice principale
[matrice setCellClass: [Casier class]];
[matrice setCellSize: [matrice frame].size];
[matrice renewRows:5 columns:4];
[matrice sizeToCells];
Ah bein oui, j'ai la réponse dans mon code :
[matrice setCellSize: [matrice frame].size];
Doit falloir ajouter une division pour la taille ?
.
J'ai supprimé cette ligne, ça va mieux mais c'est pas encore ça, mes vues se montent dessus.
c'est pour une matrice de 1 x 1... pour 4 x 5 faire quelque chose comme ça:
size.width = [matrice frame].size.x / 4;
size.height = [matrice frame].size.y / 5;
Car là en faites tu essayais de calculer tes largeur et hauteur avec les coordonnées d'origine de ta matrice, et encore, d'une drôle de manière... ???
[tt]
typedef struct _NSRect {
NSPoint origin;
NSSize size;
} NSRect;
typedef struct _NSPoint {
float x;
float y;
} NSPoint;
typedef struct _NSSize {
float width;
float height;
} NSSize;
[/tt]
Pas glop. :)beta:
Merci nucleus.