2014-12-25 18 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

相关问题