2012-10-04 43 views
2

我即將實現一個簡單的音頻推子。 我將NSSlider和NSSliderCell分類爲可以相應地繪製圖形。以編程方式更改值時調用NSControl的「valueChanged」

我想要滑塊跳到一個定義的位置,只要按下Cmd鍵點擊該句柄。這在大多數音頻應用程序中很常見。

將值設置爲滑塊的操作完美無瑕,但它不會調用操作方法來通知我的目標值已更改。 這可能發生在NSControl的mouseDown事件處理「super」的某處。這是我走到這一步:

- (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的類描述。

但我沒有線索什麼選擇器會被命名爲。 目標可能會超級?

任何幫助非常感謝!

最佳,

弗洛

回答

2

的行動可能是因爲你已經在使用你的滑塊操作方法的名稱,目標應該是類實例,其中該方法實現的。因此,舉例來說,如果你在你的應用程序委託有一個IBAction爲已連接到您的滑塊叫sliderReport:那麼這樣做:

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

附加說明:我從你的問題假設你想調用相同的IBAction爲你已經連接到你的滑塊,但你可以發送一個不同的選擇器,如果你想 - 如果你需要區分滑塊值如何改變,有一個不同的方法將是路要走。你可以將它命名爲任何你想要的東西(最後用一個冒號,所以如果你需要它可以發送它自己作爲發送者參數)。

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]; 
} 
相關問題