Вызов NSControl valueChanged при программном изменении значений

Я собираюсь реализовать простой аудио фейдер. Я создал подклассы NSSlider и NSSliderCell, чтобы иметь возможность соответствующим образом рисовать графику.

Я хочу, чтобы ползунок переходил в определенную позицию всякий раз, когда дескриптор щелкается с нажатой клавишей Cmd. Это довольно распространено в большинстве аудиоприложений.

Установка значения ползунка работает безупречно, но не вызывает метод действия, чтобы сообщить моей цели, что значение изменилось. Это должно происходить где-то в обработке события 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 : целевой объект для получения сообщения. Если объект равен нулю, приложение ищет в цепочке респондентов объект, способный обработать сообщение. Дополнительные сведения об отправке действий см. в описании класса для NSActionCell.

Но я понятия не имею, как будет называться селектор. Мишень наверное супер?

Любая помощь высоко ценится!!

Лучший,

Фло


person guitarflow    schedule 04.10.2012    source источник


Ответы (2)


Действие может быть именем метода действия, который вы уже используете для своего ползунка, а целью должен быть экземпляр класса, в котором реализован этот метод. Так, например, если у вас есть IBAction в вашем делегате приложения, который был подключен к вашему ползунку с именем sliderReport:, сделайте следующее:

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

Дополнительное примечание. Из вашего вопроса я предположил, что вы хотите вызвать тот же IBAction, который вы подключили к своему ползунку, но вы можете отправить другой селектор, если хотите - если вам нужно различать, как было изменено значение ползунка, имея другой метод был бы способом пойти. Вы можете назвать его как угодно (с двоеточием в конце, чтобы он мог отправить себя в качестве аргумента отправителя, если вам это нужно).

person rdelmar    schedule 04.10.2012

Я сам нашел ответ. Хотя ответ @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];
}
person guitarflow    schedule 05.10.2012