57 votes

La création d'un sélecteur à partir d'un nom de méthode avec des paramètres

J'ai un exemple de code qui obtient un SEL de l'objet en cours,

SEL callback = @selector(mymethod:parameter2);

Et j'ai une méthode comme

 -(void)mymethod:(id)v1 parameter2;(NSString*)v2 {
}

Maintenant j'ai besoin de bouger mymethod à un autre objet, disons myDelegate.

J'ai essayé:

SEL callback = @selector(myDelegate, mymethod:parameter2);

mais il ne compile pas.

100voto

Jason Coco Points 52303

SEL est un type qui représente un sélecteur en Objective-C. @selector() mot-clé renvoie à SEL que vous décrivez. Ce n'est pas un pointeur de fonction et vous ne pouvez pas passer les objets ou les références de tout genre. Pour chaque variable dans le sélecteur (méthode de), vous devez vous représenter que, dans l'appel à @sélecteur. Par exemple:

-(void)methodWithNoArguments;
SEL noArgumentSelector = @selector(methodWithNoArguments);

-(void)methodWithOneArgument:(id)argument;
SEL oneArgumentSelector = @selector(methodWithOneArgument:); // notice the colon here

-(void)methodWIthTwoArguments:(id)argumentOne and:(id)argumentTwo;
SEL twoArgumentSelector = @selector(methodWithTwoArguments:and:); // notice the argument names are omitted

Les sélecteurs sont généralement transmis à déléguer à des méthodes et à des rappels à préciser la méthode qui doit être appelée sur un objet spécifique lors d'un rappel. Par exemple, lorsque vous créez une minuterie, la méthode de rappel est défini comme étant:

-(void)someMethod:(NSTimer*)timer;

Ainsi, lorsque vous programmez la minuterie vous utilisez @sélecteur de spécifier la méthode sur votre objet sera réellement responsable pour le rappel:

@implementation MyObject

-(void)myTimerCallback:(NSTimer*)timer
{
    // do some computations
    if( timerShouldEnd ) {
      [timer invalidate];
    }
}

@end

// ...

int main(int argc, const char **argv)
{
    // do setup stuff
    MyObject* obj = [[MyObject alloc] init];
    SEL mySelector = @selector(myTimerCallback:);
    [NSTimer scheduledTimerWithTimeInterval:30.0 target:obj selector:mySelector userInfo:nil repeats:YES];
    // do some tear-down
    return 0;
}

Dans ce cas, vous indiquez que l'objet obj être messaged avec myTimerCallback toutes les 30 secondes.

18voto

Grant Limberg Points 7931

Vous ne pouvez pas passer un paramètre dans une @selector().

Il semble que vous essayez de mettre en œuvre une fonction de rappel. La meilleure façon de le faire serait quelque chose comme ceci:

[object setCallbackObject:self withSelector:@selector(myMethod:)];

Puis dans votre objet setCallbackObject:withSelector: méthode: vous pouvez appeler la méthode de rappel.

-(void)setCallbackObject:(id)anObject withSelector:(SEL)selector {
    [anObject performSelector:selector];
}

5voto

Marc Charbonneau Points 30464

Au-delà de ce qui a été dit déjà à propos de sélecteurs, vous pouvez regarder la NSInvocation classe.

Un NSInvocation est un Objectif-C message rendu statique, qui est, il est une action transformé en un objet. NSInvocation objets sont utilisés pour stocker et transférer des messages entre les objets et entre les applications, principalement par NSTimer objets et les objets distribués système.

Un NSInvocation objet contient tous les éléments de l'Objective-C message: une cible, un sélecteur, les arguments et la valeur de retour. Chacun de ces éléments peut être réglée directement, et la valeur de retour est réglée automatiquement lorsque le NSInvocation objet est distribué.

Gardez à l'esprit que, même si c'est utile dans certaines situations, vous n'utilisez pas NSInvocation dans une journée normale de codage. Si vous êtes juste essayer d'obtenir deux objets à parler les uns aux autres, envisager de définir d'une manière formelle ou informelle délégué protocole, ou du passage d'un sélecteur et un objet cible, comme cela a déjà été mentionné.

-6voto

BluePenguin Points 1

Ouais,le SEL type en objective-c, vous pouvez comprendre que la fonction de l'ID.

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