1

我有一个创建按钮实例的函数,我希望回调转到一个单独的函数。这不起作用(没有错误或任何事情,当我单击按钮时什么也没有发生)。我需要它是一个 C 函数,因为我正在与 Golang 交互(使用 cgo)。

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!");
}
4

2 回答 2

4

您不能将 C 函数用作NSButton. 该按钮需要一个作为对象的目标和该目标上的方法的选择器。如果没有目标,则窗口的响应者链中必须仍然有一个对象将响应选择器。

您必须创建一个对象(不必是实例;如果您愿意,您可以使用类对象)才能操作按钮。该方法还需要有一个特定的签名:它必须接受一个参数,即调用它时的按钮。

如果必须使用已经编写的函数,则必须编写一个 ObjC 类,从 action 方法调用它:

#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:)];
    ...
}

这使用类对象和类方法,因为我不确定在创建实例后您会如何处理它。但是,使用实例会更常见。

于 2014-12-25T02:46:16.797 回答
1

您的问题是您的 Start 或 ButtonClick 方法(应该是 start 和 buttonClick)都不是实例方法。它们都必须绑定到一个对象,以便将 buttonClick 设置为操作。

一旦这些都是实例方法,您应该能够在[button setTarget:self];您的 setAction 调用之上添加。

如果您无法启动实例方法,则应在调用之间添加另一个方法。

于 2014-12-25T02:28:52.317 回答