Travailler avec @selector

mac_manumac_manu Membre
03:37 modifié dans API AppKit #1
Une petite question toute bête. J'utilise dans mon code pour un timer un sélecteur.
Comment, si c'est possible, envoyer un paramètre? Dans mon exemple:

@selector(enabledMotifsCheckBoxPrimaire:)

et il me faudrait envoyer une fois YES, et une autre fois NO.

Merci pour vos enseignements...

Réponses

  • BruBru Membre
    03:37 modifié #2
    Utilise le paramètre userInfo pour passer un objet que tu pourras récupérer/utiliser dans la méthode du timer :

    {<br />    NSNumber *param;<br /><br />    // création de paramètre<br />    param=[NSNumber numberWithBoolValue:YES];<br /><br />    // déclenchement du timer<br />    [NSTimer scheduledTimerWithTimeInterval:2<br />        target:self<br />        selector:@selector(enabledMotifsCheckBoxPrimaire:)<br />        userInfo:param // le paramètre à  passer au sélecteur !<br />        repeats:NO];<br />}<br /><br />- (void)enabledMotifsCheckBoxPrimaire(NSTimer *)timer<br />{<br />    NSNumber *param;<br /><br />    // récupération du paramètre<br />    param=[timer userInfo];<br /> <br />   if ([param boolValue]) // ...<br />    else // ...<br />}
    


    .
  • mac_manumac_manu Membre
    03:37 modifié #3
    Merci pour ta réponse rapide... je m'y attèle de ce pas!!
  • mac_manumac_manu Membre
    03:37 modifié #4
    Encore une question: pour mon programme, j'aimerais que mon Timer s'initie lors qu'un textField reçoit le firstResponder, c'est-à -dire à  l'entrée du curseur. J'ai essayé avec:

    - (void)controlTextDidBeginEditing:(NSNotification *)aNotification
    {
    NSNumber *param;

    if ([aNotification object] == listeMotifsPrimaire) {

    param=[NSNumber numberWithBool:YES];
    timer = [[NSTimer scheduledTimerWithTimeInterval:0.1
      target:self
    selector:@selector(prepareToCheckMotif:)
    userInfo:param
    repeats:YES] retain];

    NSLog(@Commencer);
    }

    else if ([aNotification object] == listeMotifsCP) {

    param=[NSNumber numberWithBool:NO];
    timer = [[NSTimer scheduledTimerWithTimeInterval:0.1
      target:self
    selector:@selector(prepareToCheckMotif:)
    userInfo:param
    repeats:YES] retain];

    NSLog(@Commencer);
    }
    }

    mais il s'initie seulement si je tappe un caractère... Dès lors, lors du passage au prochain responder, comme le Timer n'est pas initialisé et que je je fais:

    if ([timer isValid]) {
    [timer invalidate];
    [timer release];
    NSLog(@Arrêter);
    }

    dans le controlTextDidEndEditing: , le programme bug.

    du moins, je pense que ce bug vient de là ...
  • 03:37 modifié #5
    Ben puisque tu n'as pas initialisé le timer, tu peux pas lui demander le YES ou NO de "isValid".
    Donc je te conseille plutôt :

    <br />if(timer!=nil)<br />&nbsp;  if([timer isValid]){<br />&nbsp; &nbsp; &nbsp;  [timer invalidate];<br />&nbsp; &nbsp; &nbsp;  [timer release];<br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;Arrêter&quot;);<br />&nbsp; &nbsp; }<br />
    


    ou même directement :
    <br />if(timer!=nil){<br />&nbsp;  [timer invalidate];<br />&nbsp;  [timer release];<br />&nbsp;  NSLog(@&quot;Arrêter&quot;);<br />}<br />
    



    Pour l'histoire du textField qui réagirai lorsque l'on clique, étant donné que celui-ci descend de NSControl, tu peux faire une sous-classe de ton textField et implémenter :
    <br />- (void)mouseDown:(NSEvent *)theEvent<br />
    

    Mais il doit sûrement y avoir plus simple
  • Eddy58Eddy58 Membre
    03:37 modifié #6
    dans 1160217586:

    Pour l'histoire du textField qui réagirai lorsque l'on clique, étant donné que celui-ci descend de NSControl, tu peux faire une sous-classe de ton textField et implémenter :
    <br />- (void)mouseDown:(NSEvent *)theEvent<br />
    

    Mais il doit sûrement y avoir plus simple


    Plus simple, apparemment non, car il n'y a pas de méthode toute faites. D'autre part le changement de responder se fait aussi lors d'une tabulation ou d'un return. Je pense que le mieux est de détecter la fin d'édition dans un textfield (méthode control:textShouldEndEditing:), et ensuite de récupérer le nextResponder du control dont l'édition se termine. :)
  • uocramuocram Membre
    03:37 modifié #7
    Une sous classe de ce genre réagit aussi bien au clic que à  la tabulation sans avoir à  saisir un caractère :

    <br />MontextField.h<br />@interface MonTextField : NSTextField {<br /><br />}<br /><br />- (BOOL) becomeFirstResponder;<br /><br />@end<br /><br />MonTextField.m<br />@implementation MonTextField<br /><br />- (BOOL) becomeFirstResponder<br />{<br />	NSLog(@&quot;&#092;nJe demarre le timer!&quot;);<br />	return YES;<br />}<br /><br />@end
    

  • elfelf Membre
    03:37 modifié #8
    je dirrais la même chose que uocram, sauf que je metterais plutôt ça:

    <br />- (BOOL) becomeFirstResponder<br />{<br />	BOOL became;<br />	if(became=[super becomeFirstResponder])<br />		NSLog(@&quot;&#092;nJe demarre le timer!&quot;);<br />	return became;<br />}<br /><br />
    
Connectez-vous ou Inscrivez-vous pour répondre.