Cocoa 为什么只有某些操作必须调用setTarget?

Cocoa 为什么只有某些操作必须调用setTarget?,cocoa,action,nstableview,target,Cocoa,Action,Nstableview,Target,对于大多数操作,我只需在InterfaceBuilder中单击并拖动即可“连接”某个接口对象对代码的调用。例如,如果我想知道用户何时单击表中的一行,我会将连接从表的操作拖到控制器的操作 但是现在让我们考虑用户双击一行。如果我希望在发生这种情况时调用我的一个操作,我不仅需要调用-[NSTableView setDoubleAction],而且还需要调用-[NSControl setTarget]。为什么? 明确地说,我不是在问为什么Interface Builder不支持setDoubleActi

对于大多数操作,我只需在InterfaceBuilder中单击并拖动即可“连接”某个接口对象对代码的调用。例如,如果我想知道用户何时单击表中的一行,我会将连接从表的操作拖到控制器的操作

但是现在让我们考虑用户双击一行。如果我希望在发生这种情况时调用我的一个操作,我不仅需要调用

-[NSTableView setDoubleAction]
,而且还需要调用
-[NSControl setTarget]
。为什么?


明确地说,我不是在问为什么Interface Builder不支持
setDoubleAction
。所有工具都有局限性。我正试图更深入地了解
setTarget
在我希望
setDoubleAction
正常工作之前,似乎没有必要使用它的方式和原因。问这个问题的另一种方式是:为什么我不需要在Interface Builder中执行任何操作来设置表的(单击)操作的目标?

如果您将表视图连接到IB中的操作,然后在其上调用
setDoubleAction
,则不需要再调用
setTarget
。但是,如果您只希望接收双击消息,而没有将表视图连接到IB中的操作,则必须调用
setTarget

表视图将
action
doubleAction
发送到同一目标。您可以想象NSTableView是这样实现的:

@implementation NSTableView

- (void)theUserClickedOnMe
{
   [self sendAction:[self action] to:[self target];
}

- (void)theUserDoubleClickedOnMe
{
   [self sendAction:[self doubleAction] to:[self target]];
}

@end
- (void)userConnectedControl:(NSControl *)control
        toAction:(SEL)action
        ofObject:(id)object
{
   [control setTarget:object];
   [control setAction:action];
}
您在IB中所做的是这样的:

@implementation NSTableView

- (void)theUserClickedOnMe
{
   [self sendAction:[self action] to:[self target];
}

- (void)theUserDoubleClickedOnMe
{
   [self sendAction:[self doubleAction] to:[self target]];
}

@end
- (void)userConnectedControl:(NSControl *)control
        toAction:(SEL)action
        ofObject:(id)object
{
   [control setTarget:object];
   [control setAction:action];
}
真正的实现与此相差甚远,但实际情况就是如此。

如果您设置了一个操作(或双击操作),但没有设置目标(或将目标设置为
nil
),则操作消息将通过响应器链传递

如果除操作外还设置了目标,则操作消息将仅指向该对象