2010-03-27 31 views
2

对于大多数操作,我只需在InterfaceBuilder中单击并拖动,将某个接口对象的调用“连线”到我的代码。例如,如果我想知道用户何时单击表中的一行,我将表中操作的连接拖动到控制器的操作中。为什么只有一些操作必须调用setTarget?

但现在让我们考虑用户双击一行。如果我希望在发生这种情况时调用我的某个操作,则不仅需要拨打-[NSTableView setDoubleAction],还需拨打也可拨打-[NSControl setTarget]。为什么?请问为什么Interface Builder不支持setDoubleAction?所有工具都有局限性。我正试图更好地了解如何以及为什么setTarget似乎没有必要,除非我想要setDoubleAction才能工作。提出这个问题的另一种方法是:为什么我不需要在Interface Builder中做任何事情来设置表(单击)操作的目标?

回答

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

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

如果除了动作之外还设置了目标,动作消息将仅转到该对象。

相关问题