NSMutableArray にセレクターを追加したいと考えています。しかし、それらは不透明な型であり、オブジェクトではないため、機能しませんよね? 使用できるラッパー オブジェクトはありますか? それとも、自分で作成する必要がありますか?
1287 次
3 に答える
9
NSValue
次のようにインスタンスにラップできます。
SEL mySelector = @selector(performSomething:);
NSValue *value = [NSValue value:&mySelector withObjCType:@encode(SEL)];
次に、インスタンスに価値を追加しNSMutableArray
ます。
于 2009-05-29T22:46:00.107 に答える
5
セレクターのNSString名を配列に格納して、
SEL mySelector = NSSelectorFromString([selectorArray objectAtIndex:0]);
保存された文字列からセレクターを生成します。
さらに、次のようなものを使用して、セレクターをNSInvocationとしてパッケージ化できます。
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:mySelector]];
[invocation setTarget:self];
[invocation setSelector:mySelector];
[invocation setArgument:&arg atIndex:2];
[invocation retainArguments];
このNSInvocationオブジェクトは、配列に格納して後で呼び出すことができます。
于 2009-05-30T00:57:24.773 に答える
2
NSValue valueWithPointer/pointerValueも同様に機能します。
配列をシリアル化できない(つまり、ファイルに書き込む)ことができないことを知っておく必要があります。その場合は、NSStringFromSelectorアプローチを使用します。
これらはすべて、セレクターをNSValueオブジェクトに配置する有効な方法です。
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];
于 2011-12-26T21:57:25.967 に答える