2009-09-07 55 views
2

我該如何聲明一個具有方法/消息的類,該方法/消息需要選擇器,存儲選擇器的值,然後再調用選擇器?使用選擇器請求回調

如果叫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); 
} 

(對不起,我知道這可能是一個RTFM,但我無法找到任何信息,我自己)

回答

6

SomeObject類需要一個引用返回給被消息的對象。

這幾乎就是委託模式;仔細查看實施細節。 (請注意,委託模式通常允許委託的所有方法都是可選的,在這種情況下,如果需要-answer:,這更像是UITableViewDataSource或NSTableView的數據源,但細節的實現就像委託模式一樣,你可能不需要測試以查看對象是否實現了該方法)。

或者,假設你真的想要一個目標/選擇器(目標/行動,可可的說法)對你有一個整數值消息:

我建議重新聲明-answer:如:

- (void) answer: (NSNumber *) aValue; 

這可以避免處理非對象參數的需要。

在你SomeObject類,你會碰到這樣的:

[myAnswerer performSelector: myAnswererSelector withObject: [NSNumber numberWithInt: 1]]; 

而且你甚至可以申報myAnswerer和myAnswererSelector爲:

@property(retain) MyAnswererClass *myAnswerer; 
@property SEL myAnswererSelector; 

然後用@synthesize在SomeObject的實現合成二傳手/吸氣。

請注意,在SnowLeopard中,所有這些都可以通過塊更加優雅地解決...