1

IB でNSButtonのサブクラスを作成し、サブクラスをボタンのカスタム クラスとして設定しました。ボタンは機能しますが、私のメイン ファイル ( NSObject ) では、同じボタンにリンクされたIBActionである " someMethod " が機能しません。私がやりたかったのは、「もし」サブクラス(NSButton)がクリックされた場合、私の(NSObject)内で someMethodがクリックされたかのように終了することです。しかし、なぜうまくいかないのか理解できません。助けてください。本当に迷っています。

ソース コード全体を提供します。.h ファイルには次のコードがあります。

#import <Cocoa/Cocoa.h>



@interface HoverButton : NSButton
{


    NSTrackingArea *trackingArea;



}



- (void)mouseEntered:(NSEvent *)theEvent;
- (void)mouseExited:(NSEvent *)theEvent;
- (void)mouseDown:(NSEvent *)ev;
- (void)mouseUp:(NSEvent *)theEvent;


@end

.m ファイルの次のコード:

#import "HoverButton.h"


@implementation HoverButton




- (void)updateTrackingAreas
{
    [super updateTrackingAreas];

    if (trackingArea)
    {
        [self removeTrackingArea:trackingArea];
        [trackingArea release];
    }

    NSTrackingAreaOptions options = NSTrackingInVisibleRect | NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow;
    trackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect options:options owner:self userInfo:nil];
    [self addTrackingArea:trackingArea];



}



- (void)mouseEntered:(NSEvent *)event
{

    [self setImage:[NSImage imageNamed:@"1"]];
}

- (void)mouseExited:(NSEvent *)event
{
    [self setImage:[NSImage imageNamed:@"2"]];
}




- (void)mouseDown:(NSEvent *)ev {

    [self setImage:[NSImage imageNamed:@"2"]];



}


- (void)mouseUp:(NSEvent *)ev {
    [self setImage:[NSImage imageNamed:@"1"]];

}
@end

これはメインの .h ファイルです。

#import <Cocoa/Cocoa.h>

@interface Main : NSObject {

}
-(IBAction) someMethod:(id) sender;

@end

およびメインの .m ファイル

#import "Main.h"

#import "HoverButton.h"

@implementation Main





-(IBAction) someMethod:(id) sender   
{

     NSEvent *SKMouseDown; //Mouse down events

     HoverButton *frac = [[HoverButton alloc] init];

    [frac mouseDown: SKMouseDown];


    exit(0); // < --- does not work, someMethod docent work.


}

@end
4

1 に答える 1

1

私の理解が正しければ、nsbutton のサブクラス内のイベントから親クラスをコールバックするのが好きです。さまざまな方法で実行できます。

  • add @property (assign) Main *delegate

  • HoverButton を割り当てた後、frac.delegate = self; を設定します。

デリゲート呼び出しを呼び出したいメソッド内で: if (delegate && [delegate performSelector:@selector(someMethod:)]) { [delegate someMethod:self]; }

以上で、両方のプラットフォームで正常に動作します

于 2012-04-25T22:14:08.323 に答える