(Edit) Push On / Off et NSSound setVolume ?

CrazyJoCrazyJo Membre
octobre 2007 modifié dans API AppKit #1
Bonjour,

J'ai inséré un bouton de type "Push On / Push Off " et je voudrais que lorsque le bouton est enfoncé (On) l'action de ce bouton continue à  jamais sauf lorsque l'on appuies dessus pour le mettre Off.
J'ai mis ce code :
<br />{<br />//	if (&#91;]); // Comment savoir si le bouton est On ou Off ? <br />			//l&#39;action ici<br /><br />}<br />
merci :o

Réponses

  • Philippe49Philippe49 Membre
    octobre 2007 modifié #2
    while([myButton state]==..)
  • psychoh13psychoh13 Mothership Developer Membre
    20:37 modifié #3
    dans 1191946989:

    while([myButton state]==..)


    Arf non ça risque pas de marcher ça..., l'action sera déclenchée et ça risque de tourner en boucle sans possibilité de s'arrêter...
    Il vaut mieux utiliser un timer. Le timer est déclenché par l'état "actif" et lorsque l'utilisateur reclique sur le bouton, le timer est invalidé et il s'arrête.
  • Philippe49Philippe49 Membre
    octobre 2007 modifié #4
    dans 1191961204:

    dans 1191946989:

    while([myButton state]==..)


    Arf non ça risque pas de marcher ça..., l'action sera déclenchée et ça risque de tourner en boucle sans possibilité de s'arrêter...


    je ne comprends pas, la lecture de l'état du bouton ne déclenche rien du tout ?
    L'action est déclenchée par l'utilisateur .. il y a quelque chose qui m'échappe dans ta remarque Psychoh ou dans la demande  de CrazyJo

    ou alors ce serait une sorte de toggle pour un Thread ?


    peux-tu expliciter ta demande old man CrazyJO ?
  • psychoh13psychoh13 Mothership Developer Membre
    20:37 modifié #5
    Je pense que toi ou lui ne prenait pas le problème dans le bon sens.
    Imaginons par exemple qu'on a un compteur qui augmente de 1 toutes les secondes (une horloge donc :DD).
    On veut déclencher notre horloge, alors on clique sur un bouton qui va activer un NSTimer qui mettra le compteur à  jour chaque seconde. Et ensuite, quand on clique à  nouveau sur le bouton qui arrête le timer. Voilà  ce que ça peut donner :

    @interface MaClasse : NSObject {<br />&nbsp; &nbsp; /*...*/<br />&nbsp; &nbsp; NSTimer *monTimer;<br />}<br />/*...*/<br />- (IBAction)monActivateur:(id)sender;<br />- (void)monAction:(NSTimer *)timer;<br />@end<br /><br />@implementation MaClasse<br />- (IBAction)monActivateur:(id)sender<br />{<br />&nbsp; &nbsp; if([sender state] == NSOnState)<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; monTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector: @selector(monAction:) userInfo:nil repeats:YES];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; else<br />&nbsp; &nbsp; &nbsp; &nbsp; [monTimer invalidate];<br />}<br /><br />- (void)monAction:(NSTimer *)timer<br />{<br />&nbsp; &nbsp; // L&#39;action à  répéter indéfiniment<br />}<br />@end
    
  • Philippe49Philippe49 Membre
    20:37 modifié #6
    Ok pour le cas d'une horloge, mais comme on ne sait pas ce que veut en faire this old man of Crazy Jo, cela peut très bien être un thread qui est lancé ou arrêté par l'action sur le bouton ...

    Ma première réponse était surtout sur la question
        // if ([]); // Comment savoir si le bouton est On ou Off ?

  • CrazyJoCrazyJo Membre
    20:37 modifié #7
    Merci pour vos réponses. Autant la réponse de Philippe49 et de psychoh13 m'ont été utile et cela a répondu à  mes questions.  o:)
    Voici le code que j'ai maintenant :
    /* Contoller */<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface Contoller : NSObject<br />{<br />&nbsp;  <br />	NSSound *theSound ;<br />	NSTimer *monTimer;<br />}<br />- (IBAction)beat:(id)sender;<br />- (IBAction)beat2:(id)sender;<br />- (void)beata:(NSTimer *)timer ;<br />- (void)beatb:(NSTimer *)timer ;<br /><br />@end<br />
    
    #import &quot;Contoller.h&quot;<br /><br />@implementation Contoller<br /><br />- (IBAction)beat:(id)sender<br />{<br />	theSound&nbsp; = [NSSound soundNamed:@&quot;test&quot;];<br />		if([sender state] == NSOnState)<br />		{<br />			monTimer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector: @selector(beata:) userInfo:nil repeats:YES];<br />		}<br />		else<br />			[monTimer invalidate];<br />			[theSound stop];<br />			<br />}<br /><br />- (void)beata:(NSTimer *)timer <br />{<br />	theSound&nbsp; = [NSSound soundNamed:@&quot;test&quot;];<br />	[theSound play];<br /><br />}<br /><br /><br /><br /><br />- (IBAction)beat2:(id)sender<br />{<br />	theSound&nbsp; = [NSSound soundNamed:@&quot;test2&quot;];<br />	if([sender state] == NSOnState)<br />	{<br />		monTimer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector: @selector(beatb:) userInfo:nil repeats:YES];<br />	}<br />	else<br />		[monTimer invalidate];<br />		[theSound stop];<br />}<br /><br />- (void)beatb:(NSTimer *)timer <br />{<br />	theSound&nbsp; = [NSSound soundNamed:@&quot;test2&quot;];<br />	[theSound play];<br />}<br /><br /><br />@end<br />
    

    Par contre je ne sais pas si j'ai le droit de garder la même variable pour chaque actions car il y a des petits problèmes lorsque les deux boutons sont ON. Ex. l'app quitte inopinément ou le son de bouton beat1 est décalé..
  • CrazyJoCrazyJo Membre
    octobre 2007 modifié #8
    Mode autoréponse :

    Effectivement  je dois mettre des noms différents aux variables : NSSound et NSTimer pour que ça fonctionne correctement .


    J'ai modifier un peu le code pour pouvoir changer le scheduledTimerWithTimeInterval. Voici le code  :
    #import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface Contoller : NSObject<br />{<br />	NSTimeInterval *twti;<br />	IBOutlet id twti_Field2;<br />}<br />- (IBAction)beat2:(id)sender;<br />- (void)beatb:(NSTimer *)timer ;<br /><br />@end<br />
    

    #import &quot;Contoller.h&quot;<br />@implementation Contoller<br />- (IBAction)beat2:(id)sender<br />{<br />	theSound2&nbsp; = [NSSound soundNamed:@&quot;test2&quot;];<br />	if([sender state] == NSOnState)<br />	{<br />		NSTimeInterval twti = [twti_Field2 floatValue];<br />		/*Warning à  cause de la variable twti : */<br />Timer2 = [NSTimer scheduledTimerWithTimeInterval:twti target:self selector: @selector(beatb:) userInfo:nil repeats:YES];<br />	}<br />	else<br />		[Timer2 invalidate];<br />		[theSound2 stop];<br />		<br />}<br />- (void)beatb:(NSTimer *)timer <br />{<br />	theSound2&nbsp; = [NSSound soundNamed:@&quot;test2&quot;];<br />	[theSound2 play];<br />}<br /><br />@end<br />
    

    Le code fonctionne mais ce Warning me dérange tout de même...

    2ème question : J'ai trouvé comment régler/modifier le volume pour un NSMovie avec setVolume:  mais ça ne fonctionne pas pour NSSound et je ne trouve pas d'équivalent dans la doc ..
Connectez-vous ou Inscrivez-vous pour répondre.