gpt4 book ai didi

objective-c - 将 C 函数设置为 NSButton 的选择器不会产生任何结果

转载 作者:行者123 更新时间:2023-12-03 17:31:26 25 4
gpt4 key购买 nike

我有一个创建按钮实例的函数,我希望回调转到一个单独的函数。这不起作用(没有错误或任何事情,只是当我单击按钮时没有任何反应)。我需要它是一个 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!");
}

最佳答案

您不能使用 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:)];
...
}

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

关于objective-c - 将 C 函数设置为 NSButton 的选择器不会产生任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27643659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com