1

ボタンのインスタンスを作成する関数があり、コールバックを別の関数に移動したいと考えています。これは機能しません (エラーも何もありません。ボタンをクリックしても何も起こりません)。Golang (cgo を使用) とやり取りしているため、C 関数である必要があります。

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。ボタンには、オブジェクトであるターゲットと、そのターゲットのメソッドのセレクターが必要です。ターゲットがない場合でも、セレクターに応答するウィンドウのレスポンダー チェーンにオブジェクトが存在する必要があります。

ボタンを操作するには、オブジェクトを作成する必要があります (インスタンスである必要はありません。必要に応じてクラス オブジェクトを使用できます)。メソッドには特定の署名も必要です。引数を 1 つ取る必要があります。これは、呼び出されたときにボタンになります。

既に作成した関数を使用する必要がある場合は、アクション メソッドからそれを呼び出す 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:)];
    ...
}

これはクラス オブジェクトとクラス メソッドを使用します。これは、インスタンスを作成した後でそのインスタンスをどうするかわからないためです。ただし、インスタンスを使用する方がはるかに一般的です。

于 2014-12-25T02:46:16.797 に答える
1

あなたの問題は、あなたの Start メソッドも ButtonClick メソッド (start と buttonClick であるべきです) もインスタンスメソッドではないということです。buttonClick をアクションとして設定するには、両方をオブジェクトに関連付ける必要があります。

[button setTarget:self];これらが両方ともインスタンス メソッドになったら、setAction 呼び出しの上に追加できるはずです。

インスタンス メソッドを開始できない場合は、呼び出しの間に別のメソッドを追加する必要があります。

于 2014-12-25T02:28:52.317 に答える