Pb de variable d'instances dans drawRect

muqaddarmuqaddar Administrateur
20:29 modifié dans API AppKit #1
Salut les jeuns,

J'ai un soucis pour lire une variable d'instance dans une classe NSView dans ma méthode drawRect :

[tt]@implementation Bouteille

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
nbreBouteillesL = [[NSNumber alloc] init];
nbreBouteillesH = [[NSNumber alloc] init];
    }
    return self;
}

//récupération des valeurs du controlleur
- (void)bouteillesPourLargeur:(NSNumber*)l andHauteur:(NSNumber*)h
{
[l retain];
[nbreBouteillesL release];
nbreBouteillesL=l;
}

- (void)drawRect:(NSRect)rect {
NSLog(@Largeur : %@", nbreBouteillesL);
}
[/tt]

Seulement le nslog m'affiche (null).
Si je le mets dans la méthode bouteillesPourLargeur, il m'affiche bien la bonne valeur...

Réponses

  • Eddy58Eddy58 Membre
    20:29 modifié #2
    Il faudrait initialiser tes NSNumber avec une valeur par défaut, sinon effectivement le log renvoie null : :)

    [tt]
    - (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
    nbreBouteillesL = [[NSNumber alloc] initWithInt:1];
    nbreBouteillesH = [[NSNumber alloc] initWithInt:1];
    }
    return self;
    }
    [/tt]
  • muqaddarmuqaddar Administrateur
    20:29 modifié #3
    Pourtant la méthode - (void)bouteillesPourLargeur:(NSNumber*)l andHauteur:(NSNumber*)h
    est appellé dans le awakeFromNib de la couche controlleur, donc devrait remplir les champs avant le drawRect non ?
  • muqaddarmuqaddar Administrateur
    20:29 modifié #4
    ça le met bien à  1, mais malheureusement il prend pas les valeurs envoyées par la méthode, même qd je recharge drawRect...
  • cbrandtcbrandt Membre
    20:29 modifié #5
    t'as essayé de mettre des nslog dans - (void)bouteillesPourLargeur:(NSNumber*)l andHauteur:(NSNumber*)h pour voir l'état de tes variables ?

    sinon, ça ne serait pas plus simple d'utiliser des int au lieu d'objets ? comme ça, plus de retain/release/alloc/init/etc... parce que bon, pour stocker un entier, à  moins que tu aies besoin de les ranger dans des dictionaries/arrays, c'est un peu lourd...

    par ailleurs, je crois que ton iniWithFrame n'est pas appelé si ton objet est créé dans le nib...
  • muqaddarmuqaddar Administrateur
    20:29 modifié #6
    Les variables sont bien affichées dans :
    - (void)bouteillesPourLargeur:(NSNumber*)l andHauteur:(NSNumber*)h
    avce des NSLogs.

    J'utilise NSNumber pour m'en servir comme variable d'instance, ce que ne permet pas int, non ?

    Là , les valeurs changent bien, mais drawRect ne les voit tjs pas... alors que
    - (void)bouteillesPourLargeur:(NSNumber*)l andHauteur:(NSNumber*)h
    les voit.
  • cbrandtcbrandt Membre
    20:29 modifié #7
    ben si, tu peux tout mettre en valeur d'instance... des pointeurs vers des objets mais aussi des types C standard, comme les int, char, les structs, etc etc

    et si tu mettais un [self display] à  la fin de bouteillesPourLargeur:hauteur: ?
  • muqaddarmuqaddar Administrateur
    20:29 modifié #8
    dans 1106651510:

    ben si, tu peux tout mettre en valeur d'instance... des pointeurs vers des objets mais aussi des types C standard, comme les int, char, les structs, etc etc

    et si tu mettais un [self display] à  la fin de bouteillesPourLargeur:hauteur: ?


    [self setNeedsDisplay:YES];
    déjà  fait...

    rien à  faire drawRect ne voit pas les 2 vars d'instance à  jour... :(
  • cbrandtcbrandt Membre
    20:29 modifié #9
    et si tu zippais le projet pour qu'on jette un oeuil ?
  • muqaddarmuqaddar Administrateur
    20:29 modifié #10
    yep
    Pas de soucis, je fais des tests.



    [Fichier joint supprimé par l'administrateur]
  • cbrandtcbrandt Membre
    20:29 modifié #11
    bon, voici ton erreur:

    dans ton nib, tu as deux instances de ta view bouteille: une dans la fenêtre, et une autre à  la racine du nib.

    l'outlet de ton contrôleur pointe vers celle à  la racine du nib, pas vers celle affichée dans la fenêtre.

    supprime celle à  la racine du nib et fais pointer l'outlet du contrôleur vers la nsview dans la fenêtre et ça roule...
  • muqaddarmuqaddar Administrateur
    20:29 modifié #12
    Bein, je suis trop content, ça marche en effet !
    Merci cbrandt.

    Je me fais avoir à  créer toujours une instance à  la racine du nib et m'en servir à  la place de l'instance de la view qui est dans la fenêtre.
Connectez-vous ou Inscrivez-vous pour répondre.