2014-12-25 20 views
0

我有一個函數可以創建一個按鈕的實例,並且我希望回調函數轉到單獨的函數。這不起作用(沒有任何錯誤或任何事情,當我點擊按鈕時沒有任何反應)。我需要它是一個C函數,因爲我正在與Golang進行交互(使用cgo)。設置C函數作爲NSButton的選擇器不會產生任何結果

void Start(void){ 
    ... 
    NSRect buttonFrame = NSMakeRect(59, 33, 82, 32); 
    NSButton *button = [[NSButton alloc] initWithFrame:buttonFrame]; 
    [button setAction:@selector(ButtonClick:)]; 
    ... 
} 
void ButtonClick(void){ 
    NSLog(@"Button clicked!"); 
} 
+0

只是一個想法:嘗試添加'[button setTarget:self];'在代碼片段的第5行之上。 – CorbinMc

+0

未聲明的標識符'self'。我在這裏寫的東西顯示* everything *,減去一個窗口等並運行它(這是在'Start'內完成的)。 – lucasem

+0

按鈕是否點擊某個功能?如果是這樣,第一個字母應該是小寫字母。這可能是問題。 – CorbinMc

回答

3

您不能將C函數用作NSButton的操作。該按鈕需要target which is an object and the selector for a method on that target。如果沒有目標,則窗口的responder chain中仍然會有一個對象響應選擇器。

您必須創建一個對象(不一定是一個實例;如果您願意,您可以使用一個類對象)以便按鈕操作。該方法還需要具有特定的簽名:它必須帶有一個參數,當它被調用時它將成爲按鈕。

如果你必須使用你已經寫的功能,你將不得不編寫從操作方法調用,直至它的ObjC類:

#import <Cocoa/Cocoa.h> 

@interface ButtonPasser : NSObject 

+ (IBAction)buttonPassthrough:(id)sender; 

@end 

@implementation ButtonPasser 

+ (IBAction)buttonPassthrough:(id)sender 
{ 
    buttonClick(); 
} 

@end 

void start(void){ 
    ... 
    NSRect buttonFrame = NSMakeRect(59, 33, 82, 32); 
    NSButton *button = [[NSButton alloc] initWithFrame:buttonFrame]; 
    [button setTarget:[ButtonPasser class]]; 
    [button setAction:@selector(buttonPassthrough:)]; 
    ... 
} 

它使用類對象和類方法,因爲我不確定在創建它之後你將如何處理實例。然而,使用實例會更加平常。

+0

對象是實例,對嗎?我從來沒有聽說過「類對象」。 – CorbinMc

+1

類是ObjC中的對象:http://stackoverflow.com/questions/6469770/class-objects-and-instance-variables-in-objective-c/6474371#6474371 –

+1

@CorbinMc http://www.apeth.com /iOSBook/ch04.html#_the_secret_life_of_class – matt

1

你的問題是你的Start或ButtonClick方法(應該是start和buttonClick)都是實例方法。它們都必須綁定到一個對象才能將buttonClick設置爲一個動作。

一旦這些都是實例方法,您應該可以在setAction調用上面添加[button setTarget:self];

如果您無法啓動實例方法,則應在調用之間添加另一種方法。

+0

正如我在提示中所說的那樣,對於我想要做的事情,我需要一個_function_(全局的,類似'void f(void){}')來運行,__not__是某個對象的一個​​方法。 – lucasem

+0

這不是實現按鈕的正確方法。按鈕操作必須發送到對象的實例方法。 – CorbinMc

+1

Cocoa是一個Objective-C框架。它不適用於靜態函數。如果你想捕獲按鈕上的點擊,它必須是Objective-C方法。我真的不明白你爲什麼期望Objective-C框架像C庫一樣工作。 – mttrb

相關問題