3

我即将实现一个简单的音频推子。我将 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 的类描述。

但我不知道选择器的名称是什么。目标可能是超级?

任何帮助深表感谢!!

最好的,

弗洛

4

2 回答 2

2

I found an answer myself. Although the answer of @rdelmar might also work, it won't anymore if you change the name of the action method.

I found a universal way of triggering the action method manually:

- (void) mouseDown:(NSEvent *)theEvent
{
    if ( ([theEvent modifierFlags] & NSCommandKeyMask) != 0)
    {
        [self setFloatValue:100.0f];
        [self.target performSelector:self.action withObject:self];
    }
    else
        [super mouseDown:theEvent];
}
于 2012-10-05T12:20:31.247 回答
2

动作可以是您已经用于滑块的动作方法的名称,目标应该是实现该方法的类实例。因此,例如,如果您的应用程序委托中有一个 IBAction 连接到名为 sliderReport: 的滑块,那么请执行以下操作:

[self sendAction:@selector(sliderReport:) to:[NSApp delegate]];

附加说明:我从您的问题中假设您想调用已连接到滑块的相同 IBAction,但如果需要,您可以发送不同的选择器 - 如果您需要区分滑块值的更改方式,则一种不同的方法将是要走的路。您可以将其命名为任何您想要的名称(末尾有一个冒号,因此如果您需要,它可以将自己作为 sender 参数发送)。

于 2012-10-04T21:02:41.520 回答