2

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

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

需要明确的是,我不是在问为什么 Interface Builder 不支持setDoubleAction. 所有工具都有局限性。我正试图更好地理解如何以及为什么setTarget似乎没有必要,除非并且直到我想setDoubleAction工作。提出这个问题的另一种方法是:为什么我不需要在 Interface Builder 中做任何事情来设置表格(单击)操作的目标?

4

2 回答 2

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];
}

真正的实现远非如此,但这实际上就是正在发生的事情。

于 2010-03-27T02:44:24.833 回答
1

如果您设置了一个动作(或双击动作)而没有设置目标(或将目标设置为nil),那么动作消息将通过响应者链。

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

于 2010-03-27T03:23:28.450 回答