Cocoa 为什么只有某些操作必须调用setTarget?
对于大多数操作,我只需在InterfaceBuilder中单击并拖动即可“连接”某个接口对象对代码的调用。例如,如果我想知道用户何时单击表中的一行,我会将连接从表的操作拖到控制器的操作Cocoa 为什么只有某些操作必须调用setTarget?,cocoa,action,nstableview,target,Cocoa,Action,Nstableview,Target,对于大多数操作,我只需在InterfaceBuilder中单击并拖动即可“连接”某个接口对象对代码的调用。例如,如果我想知道用户何时单击表中的一行,我会将连接从表的操作拖到控制器的操作 但是现在让我们考虑用户双击一行。如果我希望在发生这种情况时调用我的一个操作,我不仅需要调用-[NSTableView setDoubleAction],而且还需要调用-[NSControl setTarget]。为什么? 明确地说,我不是在问为什么Interface Builder不支持setDoubleActi
但是现在让我们考虑用户双击一行。如果我希望在发生这种情况时调用我的一个操作,我不仅需要调用
-[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
),则操作消息将通过响应器链传递
如果除操作外还设置了目标,则操作消息将仅指向该对象