使用选择器请求回调

Jac*_*cob 2 cocoa objective-c

我如何声明一个具有带选择器的方法/消息的类,存储选择器的值,然后稍后调用选择器?

如果它被称为SomeObject它将被调用如下:

-(id) init {
    // normal stuff here
    o = [[SomeObject alloc] init];
    return self;
}

-(void) checkSomething {
    [o checkSomethingWithResponse: @selector(answer:)]
}

-(void) answer: (int) value {
    NSLog(@"Check complete: %d", value);
}
Run Code Online (Sandbox Code Playgroud)

(对不起,我知道这可能是RTFM,但我自己找不到任何信息)

bbu*_*bum 6

所述SomeObject类需要一个参考回对象,以传递消息.

这几乎就是委托模式; 查看实现细节.

(请注意,委托模式通常允许委托的所有方法都是可选的.在这种情况下,如果需要-answer:,这更像是UITableViewDataSource或NSTableView的数据源.但是实现的细节只是就像委托模式一样,你可能不需要测试以查看对象是否实现了方法).

或者,假设您确实需要使用整数值发送的目标/选择器(目标/操作,在Cocoa用语中)对:

我建议重新声明-answer:as:

- (void) answer: (NSNumber *) aValue;
Run Code Online (Sandbox Code Playgroud)

这避免了处理非对象参数的需要.

在你的SomeObject类中,你有类似的东西:

[myAnswerer performSelector: myAnswererSelector withObject: [NSNumber numberWithInt: 1]];
Run Code Online (Sandbox Code Playgroud)

你甚至可以将myAnswerer和myAnswererSelector声明为:

@property(retain) MyAnswererClass *myAnswerer;
@property SEL myAnswererSelector;
Run Code Online (Sandbox Code Playgroud)

然后在SomeObject的实现中使用@synthesize来合成setter/getter.

请注意,在SnowLeopard上,使用Blocks可以更好地解决所有这些问题......