为什么只有一些动作我必须调用setTarget?

时间:2010-03-27 02:20:24

标签: cocoa action nstableview target

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

但现在让我们考虑用户双击一行。如果我希望在发生这种情况时调用我的某个操作,我不仅需要调用-[NSTableView setDoubleAction],还需要调用 -[NSControl setTarget]。为什么呢?

要明确,我询问为什么Interface Builder不支持setDoubleAction。所有工具都有局限性。我试图更好地理解setTarget似乎和为什么似乎没有必要,除非我希望setDoubleAction能够工作。提出这个问题的另一种方法是:为什么我不需要在Interface Builder中做任何事情来设置表的(单击)动作的目标?

2 个答案:

答案 0 :(得分:1)

如果您将表格视图与IB中的操作相关联,然后在其上调用setDoubleAction,则无需再拨打setTarget。但是,如果您只希望收到双击消息,并且未将表格视图连接到IB中的操作,则调用setTarget

表格视图会将actiondoubleAction发送到同一目标。您可以想象NSTableView的实现方式如下:

@implementation NSTableView

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

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

@end

你在IB做的事情是这样的:

- (void)userConnectedControl:(NSControl *)control
        toAction:(SEL)action
        ofObject:(id)object
{
   [control setTarget:object];
   [control setAction:action];
}

真正的实现与此无关,但这实际上是正在发生的事情。

答案 1 :(得分:1)

如果您设置操作(或双击操作)并且未设置目标(或将目标设置为nil),则操作消息将通过响应程序链。

如果除了操作之外还设置了目标,则操作消息将仅发送到该对象。