2011-06-30 18 views
6

次のメッセージは、または[viewController action:selector]という実際の呼び出しでrespondsToSelectorのテストに合格しますが、SIGABRTになります。スタックトレースは 'NSInvalidArgumentException、reason: - [MyViewControllerセレクタ]:認識できないセレクタ'を示します。セレクタとNSSelectorFromStringを使用してオブジェクトにメッセージを送信

[viewController @selector(selector)]コンパイルエラーが発生します(エラー: 'セレクタ'の前に ':'が必要です)。

セレクタをハードコードすると、すべて正常に動作します。

セレクタを使用してメッセージをオブジェクトに送信するにはどうすればよいですか?

-(void) notifyViewControllers:(NSString*) message 
{ 
    if(!message) return; 

    SEL selector = NSSelectorFromString(message); 
    if(!selector) return; 

    NSArray* viewControllers = [self.tabBarController viewControllers]; 
    if(!viewControllers) return; 

    for (UIViewController* viewController in viewControllers) 
    { 
     if(!viewController) continue; 

     if ([viewController respondsToSelector:selector]) { 
      // [viewController selector]; 
      [viewController action:selector]; 
     } 
    } 
} 

答えて

10
[self performSelector:@selector(notifyViewControllers:) withObject: message]; 
4

[viewController performSelector:selector]; 

はまた、NSObjectのperformSelector「家族」で他の方法を確認してみ - 彼らとあなたが簡単に遅延しておよび/またはバックグラウンドスレッドでセレクタを呼び出すことができます。それは、パラメータをサポートするセレクタを可能にするために

必要があります。

+0

感謝ウラジミールを。 Rakeshはそれを打ち負かしました(performSelector) - あなたのものは正確に正しいものでした。 – jww

2

はセレクタ文字列は、プロトコルメソッド内で使用しなければならないかもしれないので、あなたはperformSelectorを使用できない場合、これを行う方法を知っておくと便利だろう次のように指定すること:

NSString *stringForSelector = @"doSomethingAwesome:"; // notice the colon 

は、我々はタップジェスチャー

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:NSSelectorFromString(stringForSelector)]; 
を処理するつもりだとしましょう

UIGestureRecognizerクラスはアクション・コールバックで認識装置自体を使用することができます:

- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer; 

ので、タップに素晴らしい何かをする、我々は書くことができます:

- (void)doSomethingAwesome:(UITapGestureRecognizer *)tapGesture 
{ 
    // gesture handling with UIGestureRecognizer availability 
} 
関連する問題