2012-12-31 23 views
4

我只想添加一個帶有setAction參數的NSButton。NSButton setAction選擇器

NSRect frame = NSMakeRect(10, 40, 90, 40); 
NSButton* pushButton = [[NSButton alloc] initWithFrame: frame]; 
[pushButton setTarget:self]; 
[pushButton setAction:@selector(myAction:)]; 

但是我希望把一個函數參數myAction ...
如何?
謝謝。

+1

不要忘記設置目標'[pushButton setTarget:self];' – Joe

+0

當然...我加它 –

+1

@Joe謝謝,我忘了! – Colas

回答

4

但是我希望把一個函數參數myAction ...
如何?

你不行。

...如果有一個使用這種方法不止一個按鈕,我們不能區分發送者(僅適用於標題)...

有三種方式告訴哪個按鈕(或其他控制)正在與您通話:

  • 爲每個按鈕(或其他控件)分配一個標籤,並比較操作方法中的標籤。當你在一個筆尖中創建控件時,這有不利之處,你必須將標籤寫兩次(一次在代碼中,一次在筆尖中)。既然你是從頭開始寫出按鈕,你沒有這個問題。
  • 有一個出口,你希望向您發送此消息的每個控件,並比較sender到每個插座。
  • 有不同的操作方法,每個控件是唯一連接到每個操作的控件。然後,每個操作方法都不需要確定哪個控件向您發送了該消息,因爲您已經知道它是通過哪種方法發送的。

與標籤的問題是上述的重複性。忽略命名每個標籤也很容易,所以最終你會看到類似if ([sender tag] == 42)這樣的代碼,並且不知道/不得不查找哪個控件是#42。

帶插座的問題是,你的操作方法可能會很長,反正很可能就沒有任何業務相同的方法是多個不同的事情。 (這也與標籤有問題。)

所以,我一般喜歡第三個解決方案。爲每個按鈕(或其他控件)創建一個操作方法,它將使您成爲其目標。你通常會命名方法和按鈕相同(如​​和「保存」)或非常類似的東西(如terminate:和「退出」),所以你通過閱讀它屬於哪個按鈕每種方法就是知道。

+1

標籤是一個很好的解決方案...非常感謝。 –

1

我從來沒有編程創建了一個NSButton,但我認爲,你只需要創建一個方法是這樣的:

- (void) myAction: (NSButton*)button{ 
    //your code 
} 

這就是它!

+0

是的,但如果有多個按鈕使用這種方法,我們無法區分發件人(只有標題)... –

+0

您可以通過做一些事情來區分。 1)你可以使用不同的方法(它們不一定要去'myAction',或者你可以將'NSButton * pushButton'添加到你的'* .h'文件和'myAction'中來檢查NSButton'button'是什麼。 – Joe

+0

我不能使用不同的方法,因爲有多個NSWindow以編程方式創建,然後在每個NSWindow中NSButton必須有不同的動作... –