Frage

Ich möchte eine NSMutableArray Selektoren hinzuzufügen. Aber da sie undurchsichtige Typen und keine Objekte sind, dann würde das nicht funktionieren, oder? Gibt es ein Wrapper-Objekt, das ich benutzen kann? Oder muss ich meine eigene erstellen?

War es hilfreich?

Lösung

Sie können speichern Sie die NSString Name des Wählers in dem Array und verwenden

SEL mySelector = NSSelectorFromString([selectorArray objectAtIndex:0]);

, um die Wähler von der gespeicherten Zeichenfolge zu erzeugen.

Darüber hinaus können Sie den Wähler als NSInvocation mit so etwas wie

verpacken
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:mySelector]];

[invocation setTarget:self];
[invocation setSelector:mySelector];
[invocation setArgument:&arg atIndex:2];
[invocation retainArguments];

Dieses NSInvocation Objekt kann dann später in dem Array und aufgerufen gespeichert werden.

Andere Tipps

Sie können es in einer NSValue Instanz wickeln wie folgt:

SEL mySelector = @selector(performSomething:);
NSValue *value = [NSValue value:&mySelector withObjCType:@encode(SEL)];

und dann der Wert Ihrer NSMutableArray Instanz.

NSValue valueWithPointer / pointer funktioniert genauso gut.

Sie müssen nur wissen, dass Sie das Array nicht serialise kann (dh schreiben Sie es in einer Datei), wenn Sie das tun wollen, verwenden Sie den NSStringFromSelector Ansatz.

Dies sind alles Möglichkeiten, einen Selektor in ein NSValue Objekt setzen:

    id selWrapper1 = [NSValue valueWithPointer:_cmd];
    id selWrapper2 = [NSValue valueWithPointer:@selector(viewDidLoad)];
    id selWrapper3 = [NSValue valueWithPointer:@selector(setObject:forKey:)];
    NSString *myProperty = @"frame";
    NSString *propertySetter = [NSString stringWithFormat:@"set%@%@:",
                                [[myProperty substringToIndex:1]uppercaseString],
                                [myProperty substringFromIndex:1]];

    id selWrapper4 = [NSValue valueWithPointer:NSSelectorFromString(propertySetter)];

    NSArray *array = [NSArray arrayWithObjects:
                      selWrapper1,
                      selWrapper2,
                      selWrapper3,
                      selWrapper4, nil];

    SEL theCmd1 = [[array objectAtIndex:0] pointerValue];
    SEL theCmd2 = [[array objectAtIndex:1] pointerValue];
    SEL theCmd3 = [[array objectAtIndex:2] pointerValue];
    SEL theCmd4 = [[array objectAtIndex:3] pointerValue];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top