2010-10-25 6 views
55

Comment transmettre un paramètre à la méthode appelée par un NSTimer? Mon minuteur ressemble à ceci:Transmission des paramètres à la méthode appelée par un NSTimer

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

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

EDIT:

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

Mettre fin application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: '* - [MapKitDisplayViewController updateBusLocation]: sélecteur non reconnu 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: Ne vous occupez pas de votre code d'exemple fonctionne bien merci pour l'aide.

+0

question solide que je suis sûr que une tonne de gens ont demandé à un moment ou un autre. Merci! –

Répondre

95

Vous devez définir la méthode dans la cible. Puisque vous définissez la cible comme 'self', alors oui, le même objet doit implémenter la méthode. Mais vous auriez pu définir la cible à tout ce que vous vouliez. UserInfo est un pointeur que vous pouvez définir sur n'importe quel objet (ou collection) que vous aimez et qui sera transmis au sélecteur cible lorsque le temporisateur se déclenche.

Espérons que ça aide.

EDIT: ...Exemple simple:

Configurer la minuterie:

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

et mettre en œuvre le gestionnaire dans la même classe (en supposant que vous fixer l'objectif de 'soi'):

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

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

} 
+0

Je suis toujours un peu perdu, cela vous dérangerait-il de me donner un exemple de timer qui appelle une méthode et passe un paramètre à cette méthode? – bubster

+0

Bien sûr, j'ai édité ma réponse avec un exemple simple –

22

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

Un exemple simple:

[NSTimer scheduledTimerWithTimeInterval:3.0 
           target:self 
           selector:@selector(handleTimer:) 
           userInfo:@{@"parameter1": @9} 
           repeats:NO]; 

- (void)handleTimer:(NSTimer *)timer { 
    NSInteger parameter1 = [[[timer userInfo] objectForKey:@"parameter1"] integerValue]; 
} 
1

Pour Swift font comme ça,

Par exemple, vous veut envoyer UILabel avec NSTimer

override func viewDidLoad() { 
    super.viewDidLoad() 

    var MyLabel = UILabel() 
    NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("callMethod:"), userInfo: MyLabel, repeats: false) 
} 


func callMethod(timer:NSTimer){ 

    var MyLabel:UILabel = timer.userInfo as UILabel 

} 
2

Autre exemple, dans Swift en utilisant Dictionnaire littéral pour passer les paramètres à la méthode appelée par NSTimer:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let dictionary: [String : AnyObject] = ["first element" : "Jordan", 
              "second element" : Int(23)] 

    NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(0.41), 
              target: self, 
              selector: "foo:", 
              userInfo: dictionary, 
              repeats: false) 
} 

func foo(timer: NSTimer) { 
     let dictionary: [String : AnyObject] = timer.userInfo! as! [String : AnyObject] 
     let firstElement: String = dictionary["first element"] as! String 
     let secondElement: Int = dictionary["second element"] as! Int 
     print("\(firstElement) - \(secondElement)") 
} 
Questions connexes