我即将实现一个简单的音频推子。 我将NSSlider和NSSliderCell子类化,以便能够相应地绘制图形。
每当按下Cmd键单击手柄时,我希望滑块跳转到定义的位置。这在大多数音频应用中非常常见。
将值设置为滑块是完美无缺的,但它不会调用action方法来通知我的目标值已更改。 这必须发生在“super”的mouseDown事件处理中,可能在NSControl中。这是我到目前为止所得到的:
- (void) mouseDown:(NSEvent *)theEvent
{
if ( ([theEvent modifierFlags] & NSCommandKeyMask) > 0)
[self setFloatValue:100.0f];
else
[super mouseDown:theEvent];
}
我在NSControl文档中发现了一个看起来很有希望的方法:
-(BOOL)sendAction:(SEL)theAction to:(id)theTarget Parameters :
theAction:要在目标上调用的选择器。如果选择器是 NULL,不发送任何消息。
theTarget:接收消息的目标对象。如果对象是 nil,应用程序在响应者链中搜索对象 能够处理消息。有关调度的更多信息 操作,请参阅NSActionCell的类描述。
但我不清楚选择器的名称是什么。 目标可能是超级?
非常感谢任何帮助!!
最佳,
弗洛
答案 0 :(得分:2)
操作可以是您已经用于滑块的操作方法的名称,目标应该是实现该方法的类实例。因此,例如,如果您的app委托中有一个连接到名为sliderReport的滑块的IBAction,请执行以下操作:
[self sendAction:@selector(sliderReport:) to:[NSApp delegate]];
附加说明:我从您的问题中假设您想要调用已连接到滑块的相同IBAction,但如果需要,可以发送不同的选择器 - 如果您需要区分滑块值的方式改变了,有一个不同的方法将是要走的路。你可以将它命名为任何你想要的东西(最后用冒号,所以如果你需要的话,它可以将自己作为sender参数发送)。
答案 1 :(得分:2)
我自己找到了答案。 虽然@rdelmar的答案也可能有效,但如果你改变动作方法的名称,它将不再存在。
我找到了一种手动触发动作方法的通用方法:
- (void) mouseDown:(NSEvent *)theEvent
{
if ( ([theEvent modifierFlags] & NSCommandKeyMask) != 0)
{
[self setFloatValue:100.0f];
[self.target performSelector:self.action withObject:self];
}
else
[super mouseDown:theEvent];
}