Flèches de scroller

olivier555olivier555 Membre
21:36 modifié dans API AppKit #1
Bonjour!
Ca y est, mes scrollers marchent!! J'avais tenté de faire une classe faisant un peu trop de choses, et mon code était trop fouilli. Maintenant tout va bien sauf un dernier problème : Les flèches du scrollers n'ont aucune action. En fait, j'ai assigné au scroller une action :

<br />[[scrollView verticalScroller] setTarget:self];<br />[[scrollView verticalScroller] setAction:@selector(drawRect:)];<br />


C'est peut être la cause de mon problème. Actuellement, lorsque je clique sur les flèches, elles s'illuminent mais n'ont aucun effet sur la jauge du scroller (et ne font pas non plus appel à  la fonction drawRect). Auriez vous une idée s'il vous plait? Merci!!

Réponses

  • cbrandtcbrandt Membre
    21:36 modifié #2
    déjà , drawRect veut un NSRect, or une action va envoyer l'émetteur du message (type id) (donc le scroller dans ton cas) comme paramètre... donc tu ne peux pas faire comme ça.
  • olivier555olivier555 Membre
    21:36 modifié #3
    OK OK j'ai fait ça pour faire plus propre :

    <br />[[scrollView verticalScroller] setTarget:self];<br />[[scrollView verticalScroller] setAction:@selector(refresh)];<br />[/code]<br /><br />avec<br /><br />[code]<br />- (void)refresh<br />{<br />[self drawRect:[self bounds]];<br />}<br />
    


    Mais ça ne change rien, les fleches n'ont toujours aucun effet...
  • Eddy58Eddy58 Membre
    21:36 modifié #4
    Il ne faut JAMAIS appeler drawRect directement...ça ne fait rien. Il faut faire un setNeedsDisplay pour que le système fasse sa petite cuisine ensuite il va s'occuper du tracé proprement dit... :)
    [tt]
    - (void)refresh
    {
    [self setNeedsDisplay:YES];
    }
    [/tt]
  • olivier555olivier555 Membre
    21:36 modifié #5
    Merci! T'as raison, j'ai modifié, c'ets encore plus propre! Mais les fleches ne marchent toujours pas....  :crackboom:-
  • Eddy58Eddy58 Membre
    21:36 modifié #6
    C'est curieux tu n'as pas mis les ":" dans ton selector, c'est pareil dans ton projet ? S'ils n'y sont pas, tu devrais avoir un message d'erreur a l'exécution, il faut les rajouter... :)
    [tt]
    [[scrollView verticalScroller] setAction:@selector(refresh:)];
    [/tt]
  • ClicCoolClicCool Membre
    21:36 modifié #7
    dans 1111422321:

    C'est curieux tu n'as pas mis les ":" dans ton selector ...


    T'es sûr qu'il faut mettre les ":" pour un sélector concernant une méthode n'attendant pas d'argument ? ???
  • Eddy58Eddy58 Membre
    21:36 modifié #8
    Oui ClicCool, de toute façon si tu ne mets pas les ":", ça te produit un message d'erreur a l'exécution, enfin moi c'est ce que ça me fait en tout cas. ;)
  • ClicCoolClicCool Membre
    21:36 modifié #9
    dans 1111424528:

    Oui ClicCool, de toute façon si tu ne mets pas les ":", ça te produit un message d'erreur a l'exécution, enfin moi c'est ce que ça me fait en tout cas. ;)


    En fait j'ai pris le pb à  l'envers !!!
    C'est sur qu'il faut les ":" puisque un setAction attend OBLIGATOIREMENT une méthode avec 1 seul argument le "sender"

    C'est la méthode qui foire pas le sélector.

    - (void)refresh:(id) sender

    ;) ;)
  • Eddy58Eddy58 Membre
    21:36 modifié #10
    Oui c'est vrai ClicCool, en regardant la doc de plus près c'est effectivement ce qu'il y est dit... :o
    donc en faites, un [tt]setAction:@selector(refresh:)[/tt], correspond en faites a un [tt]setAction:@selector(refresh:nil)[/tt], et pour être correcte il faudrait donc mettre dans ce cas
    [tt]setAction:@selector(refresh:self)[/tt]
  • ClicCoolClicCool Membre
    21:36 modifié #11
    Je ne crois pas non plus.

    c'est setAction:@selector(refresh:) tout court.
    l'objet dont on "set" ainsi l'action sera alors envoyé comme argument ...

    C'est la méthode refresh qui est mal déclarée et mal implémentée.
    Elle doit être déclarée et implémentée comme une IBAction:

    -(void ou IBAction) refresh:(id) sender;
  • Eddy58Eddy58 Membre
    mars 2005 modifié #12
    Ok...mais les IBAction (Interface Builder Action) ne sont-elles pas uniquement dédiées pour faire les liens avec les objets dans les fichiers nib ? ???

    [EDIT]Remarque, on accède à  l'instance de la scrollview et donc de ses scrollers, via un outlet, donc le fait de mettre IBAction doit marcher... :)
  • ClicCoolClicCool Membre
    21:36 modifié #13
    Une IBAction est en effet une méthode, recevant un seul argument, formatée de façon que IB la reconnaisse.
    Mais rien ne t'empèche dans ton code d'appeler une IBAction comme n'importe quelle méthode.
    [self refresh:self];
    


    Faut juste veiller à  ce que l'objet que tu transmet (self ou autre) réponde bien au méthode que l'action est susceptible du lui adresser en retour...
    Si, par ex. l'IBAction refresh comporte une ligne comme
    if (NSOnState == [sender state]) { .../...
    

    ben il faut ici que self réponde à  la méthode state ...
    Ou alors appeler l'action en lui transmettant comme sender, plutot que self, un objet qui y répond:
    [self refresh:outletDuButton];
    


    :o
  • olivier555olivier555 Membre
    21:36 modifié #14
    Ouais en fait le problème c'est que quand je ne fais pas correspondre de méthode (en l'occurence refresh) à  mon scroller, les flèches répondent, mais quand je fais correspondre refresh ou une autre méthode toute simple, les flèches sont bien "bleues" quand je clique dessus mais pas de réaction de la part du scroller (et par conséquent pas non plus de la part de l'affichage). C'est comme si le fait d'utiliser les flèches appelait la fonction refresh au moment précis du clique et que du coup le programme n'avait pas le temps de faire bouger le scroller (ou un truc comme ça :o ). Y-a t'il un autre moyen d'assigner au scroller une action, sachant que le scroller en question appartient à  la NSScrollView qui encapsule ma Custom View?
  • olivier555olivier555 Membre
    21:36 modifié #15
    J'ai vraiment que des problèmes chelou moi!! Merci de votre patience...
Connectez-vous ou Inscrivez-vous pour répondre.