2

さて、私は次のようなカスタム SEL を作成しています。

NSArray *tableArray = [NSArray arrayWithObjects:@"aaa", @"bbb", nil];
for ( NSString *table in tableArray ){
    SEL customSelector = NSSelectorFromString([NSString stringWithFormat:@"abcWith%@", table]);
    [self performSelector:customSelector withObject:0];
}

エラーが発生しました: キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '-[Sync aaaWithaaa]: 認識されないセレクターがインスタンスに送信されました

しかし、実際のメソッド名で実行すると動作します!

[self performSelector:@selector(aaaWithaaa:) withObject:0];

それを解決する方法は?

4

4 に答える 4

6

すでに文字列からセレクターを作成しています - それを performSelector: メソッドに渡します:

[self performSelector:customSelector withObject:0];

編集:メソッドがパラメーターを受け取る場合、そこからセレクターを作成するときにコロンを使用する必要があることに注意してください。

// Note that you may need colon here:
[NSString stringWithFormat:@"abcWith%@:", table]
于 2012-04-09T13:23:15.453 に答える
1
NSArray *tableArray = [NSArray arrayWithObjects:@"aaa", @"bbb", nil];

for ( NSString *table in tableArray ){
     SEL customSelector = NSSelectorFromString([NSString stringWithFormat:@"abcWith%@:", table]);
     [self performSelector:customSelector withObject:0];
 }
于 2012-04-09T13:25:06.237 に答える
0
- (id)performSelector:(SEL)aSelector withObject:(id)anObject

最初の引数はSEL型です。

SEL customSelector = NSSelectorFromString([NSString stringWithFormat:@"abcWith%@", table]);
[self performSelector:customSelector withObject:0];
于 2012-04-09T13:26:18.183 に答える
0

近い。

違いは@selector(aaaWithaaa:)、メソッド名を渡すの@selector(customSelector:)に対し、SEL 型の変数を渡すことです (予備のコロンを使用)。

代わりに、次のものが必要です。

[self performSelector:customSelector withObject:0];

もう 1 つの違いは、最後にコロンを付けて文字列を記述stringWithFormat:することですが、コロンはありません。重要です。メソッドがパラメータを取ることを意味します。メソッドにパラメーターがある場合は、そこにある必要があります。つまり、

[NSString stringWithFormat:@"abcWith%@:", table]
于 2012-04-09T13:24:54.483 に答える