对于大多数操作,我只需在InterfaceBuilder中单击并拖动即可将来自某个界面对象的调用“连线”到我的代码。例如,如果我想知道用户何时单击表格中的一行,我会将表格动作中的连接拖动到控制器的操作中。
但现在让我们考虑用户双击一行。如果我希望在发生这种情况时调用我的某个操作,我不仅需要调用-[NSTableView setDoubleAction]
,还需要调用 -[NSControl setTarget]
。为什么呢?
要明确,我不询问为什么Interface Builder不支持setDoubleAction
。所有工具都有局限性。我试图更好地理解setTarget
似乎和为什么似乎没有必要,除非我希望setDoubleAction
能够工作。提出这个问题的另一种方法是:为什么我不需要在Interface Builder中做任何事情来设置表的(单击)动作的目标?
答案 0 :(得分:1)
如果您将表格视图与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
你在IB做的事情是这样的:
- (void)userConnectedControl:(NSControl *)control
toAction:(SEL)action
ofObject:(id)object
{
[control setTarget:object];
[control setAction:action];
}
真正的实现与此无关,但这实际上是正在发生的事情。
答案 1 :(得分:1)
如果您设置操作(或双击操作)并且未设置目标(或将目标设置为nil
),则操作消息将通过响应程序链。
如果除了操作之外还设置了目标,则操作消息将仅发送到该对象。