「セレクターの配列」を作成する方法


82

私はiPhoneSDK(3.0)を使用しており、1つのクラス内でさまざまなメソッドを呼び出すためのセレクターの配列を作成しようとしています。

明らかに、私は何か間違ったことをしています(@selectorはクラスとは見なされないため、NSArrayに詰め込むことは機能していません)。

私はこれを試しましたが、明らかに間違っています。

このようなセレクターの配列を作成する簡単な方法はありますか?または、メソッドのコレクションを反復処理するためのより良い方法はありますか?

selectors = [NSArray arrayWithObjects:
                          @selector(method1),
                          @selector(method2),
                          @selector(method3),
                          @selector(method4),
                          @selector(method5),
                          @selector(method6),
                          @selector(method7), nil];

for (int i = 0; i < [selectors count]; i++) {
    if ([self performSelector:[selectors objectAtIndex:i]]) // do stuff;
}

回答:


79

文字列を保存してNSSelectorFromStringを使用できますか?

ドキュメントから

NSSelectorFromString

指定された名前のセレクターを返します。

SEL NSSelectorFromString (
   NSString *aSelectorName
);

2
セレクターの配列だけが必要な場合には、適切なソリューションではありません。
Aleks N. 2012

1
NSPointerArray優れている。
DawnSong


35

単純なC配列を使用しないのはなぜですか?

static const SEL selectors[] = {@selector(method1),
                                ....
                                @selector(method7)};

...

for (int i = 0; i < sizeof(selectors)/sizeof(selectors[0]); i++) {
  [self performSelector:selectors[i]];
  // ....
}

3
良いですが、staticここでは必要ありません(初期化子はコンパイル時定数ではありません)。
Aleks N. 2012

12

の配列を作成することもできますNSInvocation。これは、セレクターを使用するために引数が必要な場合に便利です。

NSMethodSignature *sig = [[yourTarget class] instanceMethodSignatureForSelector:yourSEL];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];
[inv setTarget:yourTarget];
[inv setSelector:yourSEL];
[inv setArgument:&yourObject atIndex:2]; // Address of your object

NSInvocationは高すぎます。
DawnSong 2016

1

リストが静的な場合は、KennyTMのソリューションを使用しますが、動的配列またはセットが必要な場合は、セレクター文字列を格納する以外に、SELプロパティまたはivarを使用してオブジェクトを作成し、それを格納することもできます。

@interface SelectorObject : NSObject
@property (assign, readonly, nonatomic) SEL selector;
- (id)initWithSelector:(SEL)selector;
@end

@implementation SelectorObject
- (id)initWithSelector:(SEL)selector {
  self = [super init];
  if (self) {
    _selector = selector;
  }
  return self;
}
@end

次にperform、クラスにメソッドを追加して、そこでメソッド呼び出しを実装することもできます。


1

セレクターを配列に格納する2つの方法を補足したいと思います。

まず、NSPointerArrayなど、不透明なポインタを格納できるSELように、アップルのドキュメントを述べ、

NSPointerArray *selectors = [[NSPointerArray alloc] initWithOptions: NSPointerFunctionsOpaqueMemory];
[selectors addPointer:@selector(onSendButton:)];
[button addTarget: self action:[selectors pointerAt:0] forControlEvents:UIControlEventTouchUpInside];

第二に、Cスタイルの配列ははるかに単純です。

SEL selectors[] = { @selector(onSendButton:) };
[button addTarget: self action:selectors[0] forControlEvents:UIControlEventTouchUpInside];

必要に応じて選択してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.