Frage

Ich habe ein Codebeispiel, das eine SEL aus dem aktuellen Objekt wird,

SEL callback = @selector(mymethod:parameter2);

Und ich habe eine Methode wie

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

Jetzt muss ich mymethod auf ein anderes Objekt bewegen, sagen myDelegate.

Ich habe versucht:

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

, aber es wird nicht kompiliert.

War es hilfreich?

Lösung

SEL ist ein Typ, der einen Selektor in Objective-C darstellt. Die @selector () Schlüsselwort gibt einen SEL, die Sie beschreiben. Es ist nicht ein Funktionszeiger und kann keine Gegenstände oder Hinweise jeglicher Art bestehen. Für jede Variable in dem Selektor (Methode), müssen Sie in dem Anruf darstellen, das @selector. Zum Beispiel:

-(void)methodWithNoParameters;
SEL noParameterSelector = @selector(methodWithNoParameters);

-(void)methodWithOneParameter:(id)parameter;
SEL oneParameterSelector = @selector(methodWithOneParameter:); // notice the colon here

-(void)methodWIthTwoParameters:(id)parameterOne and:(id)parameterTwo;
SEL twoParameterSelector = @selector(methodWithTwoParameters:and:); // notice the parameter names are omitted

Selektoren werden in der Regel Methoden übergeben zu delegieren und zu Rückrufe angeben, welche Methode sollte während eines Rückruf auf einem bestimmten Objekt aufgerufen werden. Zum Beispiel, wenn Sie einen Timer erstellen, wird die Callback-Methode speziell definiert als:

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

Also, wenn Sie den Timer planen Sie @selector welche Methode auf dem Objekt festlegen, würden für den Rückruf tatsächlich verantwortlich sein:

@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;
}

In diesem Fall geben Sie an, dass das Objekt OBJ alle 30 Sekunden mit myTimerCallback messaged werden.

Andere Tipps

Sie können einen Parameter in einem @selector () übergeben.

Es sieht aus wie Sie versuchen, einen Rückruf zu implementieren. Der beste Weg, das zu tun, so etwas wie dies wäre:

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

Dann in Ihrem Objekt setCallbackObject: withSelector: Methode. Sie Ihre Callback-Methode aufrufen

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

Darüber hinaus, was bereits über Selektoren gesagt worden ist, können Sie an der NSInvocation Klasse suchen.

  

Ein NSInvocation ist eine Objective-C-Nachricht gemacht statisch, das heißt, es ist eine Aktion in ein Objekt verwandelt. NSInvocation Objekte werden zur Speicherung und Weiterleitung von Nachrichten zwischen Objekten und zwischen den Anwendungen, in erster Linie durch NSTimer Objekte und das verteilten Objekte System.

     

Ein NSInvocation Objekt enthält alle Elemente einer Objective-C-Nachricht: ein Ziel, ein Selektor, Argumente und der Rückgabewert. Jedes dieser Elemente kann direkt eingestellt wird, und der Rückgabewert wird automatisch eingestellt, wenn das NSInvocation Objekt ausgelöst wird.

Beachten Sie, dass, während es in bestimmten Situationen nützlich ist, setzen Sie ein NSInvocation nicht in einem normalen Tag der Codierung. Wenn Sie sich nur um zwei Objekte versuchen, miteinander zu reden, sollten Sie ein informelles oder formelles Delegaten Protokoll definiert, oder einen Wähler vorbei und Zielobjekt, wie bereits erwähnt wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top