2009-08-14 16 views
1

ターゲットとコールバックを指定できる多くのObjective-C/Cocoa SDK APIがあります。クラス間で@selectorメソッドを呼び出す

が、私は私のクラスの2で同じことをやってみたいが、私はセレクタに渡さ保存し、後でそれを起動しようとすると、私は例外を取得、

「認識されていないセレクタが インスタンスに送信されました」

私がClassBのには、このようなターゲットとアクションをオフに渡します

[myClassB doSomething:self action:@selector(anAction:)]; 

ClassBのは、このように宣言して実装されます。ビルドプロセス中に

@interface ClassB 
{ 
    id target; 
    SEL targetAction; 
} 

@implementation ClassB 

-(void)theWork { 
if ([target respondsToSelector:targetAction]) 
{ 
    [target targetAction]; 
} 
} 

、私はまた、次の警告を受ける:NO '-targetAction' メソッドは、どのように供給されたターゲット・アクションを呼び出すことができます

見つかりませんか?私が達成したい何

は、次のようになります。

UIBarButtonItem *cancelButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel 
      target:self 
      action:@selector(cancelItem:)]; 

答えて

4
[target targetAction]; 

はtargetActionと呼ばれる方法を実行することを意味します。

あなたがあなたのIVARにセレクタ名を格納する必要が

[target performSelector:targetAction]; 
0

をしたい:

ClassBの中に今
ClassB *b = [[ClassB alloc] init]; 
SomeOtherClass *a = [[SomeOtherClass alloc] init]; 

// next two lines require properties to be declared 
b.target = a; 
b.targetAction = @selector(doTask:); 

あなたはそれだろう

[target performSelector:targetAction withObject:someObject]; 

で上のメソッドを呼び出すことができます呼び出す

- (void)doTask:(id)object 

SomeOtherClassにsomeObjectを渡します。