2010-08-10 5 views
2

Si tel est le nom de la méthode qui doit être appelé:paramètres multiples dans @selector en Objective-C

-(Authenticate_Obj)Authenticate_User:(NSString*)Number:(NSString*)name:(NSString*)password 

comment appeler cette méthode de la @selector ??

puis-je le faire de cette façon ??

[tis_obj AuthenticateMobileServer:self action:@selector(AuthenticateUser:::)]; 

Merci.

Répondre

3

Comme Chris a une syntaxe correcte de déclarer sélecteur pour une méthode avec plusieurs paramètres est

@selector(Authenticate_User:Number:name:) 

Cependant, vous ne pouvez pas appeler une méthode qui prend plus de 1 paramètre en utilisant la méthode -performSelector (et similaire) - vous devez utiliser la classe NSInvocation pour cette

+1

Ce n'est pas correct ... erreur facile à faire compte tenu de la déclaration non-standard. – bbum

+0

hm, où l'erreur est? (Je suppose que le nom du paramètre Authenticate_User est manquant dans la déclaration) – Vladimir

+2

Le sélecteur est incorrect. Compte tenu de sa déclaration, il s'agit de 'Authenticate_User :::'. Les bits 'number',' name' et 'password' sont des noms d'arguments. – bbum

2

Vous pouvez le faire comme ceci: @selector(Authenticate_User:Number:name:)

8

Compte tenu de ceci:

-(Authenticate_Obj)Authenticate_User:(NSString*)Number:(NSString*)name:(NSString*)password 

sélecteur de votre méthode est:

Authenticate_User::: 

Quelle est la chaîne que vous passeriez à @selector().

Votre méthode AuthenticateMobileServer:action: doit prendre un sélecteur qui, lorsqu'il est appelé, prend cet ensemble d'arguments, évidemment.

Il y a, cependant, plusieurs problèmes avec ce code (le premier indice étant les deux réponses fausses de gens autrement très bien informés).

  1. Les noms de méthode ne commencent pas par des lettres majuscules, et ils n'ont _ s en eux. Les noms de méthodes sont en chameau. Donc, quelque chose comme authenticateUserNumber:name:password: serait un nom de méthode plus approprié.

  2. Chaque argument doit avoir une partie du nom de la méthode qui le décrit. Encore une fois, authenticateUserNumber:name:password: serait conforme à la pratique standard.

  3. Les noms de classe ne contiennent pas _. Je suppose que Authenticate_Obj est une classe. Si c'est le cas, il doit également être renvoyé en tant que pointeur.

A savoir, cette méthode devrait probablement être quelque chose comme:

- (AuthenticateObject *) authenticateUserNumber: (NSString*) aNum 
              name: (NSString *) aName 
             password: (NSString *) aPassword; 
0

Envoyer un NSMutableDictionary ou NSMutableArray, qui contient toutes les infos nécessaires en tant que paramètre.

0

Vous pouvez le faire en utilisant NSInvocation:

SEL selector = @selector(Authenticate_User:Number:name:); 
NSMethodSignature * ms = [self methodSignatureForSelector:selector]; 
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:ms]; 
[inv setTarget:self]; 
[inv setSelector:selector]; 
[inv setArgument:&param1 atIndex:2]; 
[inv setArgument:&param2 atIndex:3]; 
[inv setArgument:&param3 atIndex:3]; 
[inv invoke]; 
Authenticate_Obj * returnObject = nil; 
[inv getReturnValue:&returnObject]; 

Je vous suggère de vérifier le dépôt GitHub Erica Sadun appelé NSObject-Utilities pour vérifier d'autres exemples de code avec NSInvocation.