64 votes

Passage de paramètres à la méthode appelée par un NSTimer

Comment puis-je passer un paramètre à la méthode appelée par un NSTimer? Mon timer ressemble à ceci:

[NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(updateBusLocation) userInfo:nil repeats:YES];

et je veux être en mesure de passer d'une chaîne à la méthode updateBusLocation. Aussi, où suis censé définir la méthode updateBusLocation? Dans le même .m fichier que j'ai créer le minuteur?

EDIT:

En fait, je suis toujours avoir des problèmes. Je reçois le message d'erreur:

Résiliation d'application en raison de uncaught exception 'NSInvalidArgumentException', la raison: '* -[MapKitDisplayViewController updateBusLocation]: unrecognized sélecteur envoyé à l'instance 0x4623600'

Voici mon code:

- (IBAction) showBus {

//do something

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateBusLocation) userInfo:txtFieldData repeats:YES];
[txtFieldData release];
 }


 - (void) updateBusLocation:(NSTimer*)theTimer
 {
      NSLog(@"timer method was called");
      NSString *txtFieldData = [[NSString alloc] initWithString:(NSString*)[theTimer userInfo]];
if(txtFieldData == busNum.text) {
    //do something else
    }
    }

EDIT #2: Jamais l'esprit de votre exemple de code fonctionne très bien merci pour l'aide.

103voto

Firoze Lafeer Points 13596

Vous devez définir la méthode de la cible. Depuis que vous avez établi la cible sous ... "pour soi", alors oui, ce même objet doit implémenter la méthode. Mais vous auriez pu définir la cible à autre chose que vous vouliez.

userInfo est un pointeur que vous pouvez définir pour tout objet (ou collection) que vous aimez et qui sera transmis à la cible sélecteur lorsque la minuterie se déclenche.

Espérons que cela aide.

EDIT: ... Simple Exemple:

Réglez la minuterie:

    NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:2.0 
                              target:self 
                              selector:@selector(handleTimer:) 
                              userInfo:@"someString" repeats:NO];

et de mettre en œuvre le gestionnaire dans la même classe (en supposant que vous êtes le réglage de la cible à 'auto'):

- (void)handleTimer:(NSTimer*)theTimer {

   NSLog (@"Got the string: %@", (NSString*)[theTimer userInfo]);

}

25voto

Oleh Kudinov Points 731

Vous pouvez passer vos arguments avec userInfo: [NSDictionary dictionaryWithObjectsAndKeys:parameterObj1, @"keyOfParameter1"];

Un exemple simple:

 [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(handleTimer:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:9], @"parameter1", nil] repeats:YES];

-(void) handleTimer:(NSTimer *)timer{

    int parameter1 = [[[timer userInfo] objectForKey:@"parameter1"] integerValue];

    if(parameter1>0){
        [timer invalidate];
        timer=nil;
   }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X