在类之间调用@selector方法

时间:2009-08-14 19:18:21

标签: iphone

我看到很多Objective-C / Cocoa SDK apis,您可以在其中指定目标和将被回调的动作。

我想在我的两个类中做同样的事情,但是当我存储传入的选择器并稍后尝试调用它时,我得到了异常,

  

“无法识别的选择器已发送至   实例“

我将目标和行动传递给ClassB:

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

ClassB被声明并实现为:

@interface ClassB
{
   id  target;
   SEL targetAction;
}

@implementation ClassB 

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

在构建过程中,我还收到以下警告:

  

找不到'-targetAction'方法

如何调用提供的目标操作?

我想要达到的目的与此类似:

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

2 个答案:

答案 0 :(得分:4)

[target targetAction];

表示运行名为targetAction的方法。

你想要

[target performSelector:targetAction];

答案 1 :(得分:0)

您需要将选择器名称存储在ivar中:

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:);

现在在ClassB中,您可以使用

调用方法
[target performSelector:targetAction withObject:someObject];

那会调用

- (void)doTask:(id)object
类someOtherClass将someObject传递给它。