以编程方式更改值时调用NSControl的“valueChanged”

时间:2012-10-04 20:43:01

标签: objective-c cocoa action nsslider

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

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

非常感谢任何帮助!!

最佳,

弗洛

2 个答案:

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