Objective c 自定义按钮类setuserinteractionenabled

Objective c 自定义按钮类setuserinteractionenabled,objective-c,button,sprite-kit,Objective C,Button,Sprite Kit,注意:这是用于OSX应用程序,而不是iOS应用程序 我正在创建一个自定义按钮类,它是SKSpriteNode的一个子类。我希望这个类能够处理按钮按下,所以我发现我必须将setuserinteractionenabled设置为YES。当我在自定义按钮类中执行此操作时,mouseDown事件会接收消息。创建按钮的SKScene在单击按钮时不再接收消息。有没有办法解决这个问题?我甚至尝试在SKScene中启用setuserinteractionenabled,但没有成功。我找不到任何问题来解决这个问题

注意:这是用于OSX应用程序,而不是iOS应用程序

我正在创建一个自定义按钮类,它是SKSpriteNode的一个子类。我希望这个类能够处理按钮按下,所以我发现我必须将setuserinteractionenabled设置为YES。当我在自定义按钮类中执行此操作时,mouseDown事件会接收消息。创建按钮的SKScene在单击按钮时不再接收消息。有没有办法解决这个问题?我甚至尝试在SKScene中启用setuserinteractionenabled,但没有成功。我找不到任何问题来解决这个问题

按钮

#import <SpriteKit/SpriteKit.h>

typedef enum ButtonState {
    UNPRESSED,
    PRESSED
} ButtonState;

@interface Button : SKSpriteNode

@property ButtonState state;

-(id)initButtonWithImage:(NSString*)unselectedImage selectedImage:(NSString*)selectedImage;
-(void)setButtonState:(NSString*)event;

@end
GameMenu.m(一个场景)

AppDelegate.m

....(header files etc)
@implementation AppDelegate

@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    /* Set up the window for the app */
    NSRect frame = [_window frame];
    frame.size = CGSizeMake(1280, 740);
    [_window setFrame: frame display: YES animate: NO];
    [_window center]; //sets the window to the centre of the screen

    /* Pick a size for the scene */
    //SKScene *scene = [ChordAttackMenu sceneWithSize:CGSizeMake(1280, 720)]; //ChordAttack Menu
    //SKScene *scene = [MyScene sceneWithSize:CGSizeMake(1280, 720)]; //ChordAttack
    //SKScene *scene = [NoteBlasterMenu sceneWithSize:CGSizeMake(1280, 720)]; //BassBlaster Menu
    //SKScene *scene = [NoteBlaster sceneWithSize:CGSizeMake(1280, 720)]; //BassBlaster
    SKScene *scene = [GameMenu sceneWithSize:CGSizeMake(1280, 720)];

    /* Set the scale mode to scale to fit the window */
    //scene.scaleMode = SKSceneScaleModeAspectFit;
    scene.scaleMode = SKSceneScaleModeAspectFill;

    [self.skView presentScene:scene];

    self.skView.showsFPS = YES;
    self.skView.showsNodeCount = YES;
}

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
    return YES;
}

所以这很奇怪。你可以看出,我不是目标c最好的。但根据苹果公司的说法,在你处理完事件后,你会将其传递给响应者链

[super theEvent];
但在本例中,游戏场景是按钮的父级,而不是其超级视图。因此,您需要做的是这样调用事件:

[self.parent theEvent];


最好有一个控制器以一种不太复杂的方式管理这些事件。因为添加的每个孩子都希望向上传递事件,所以响应者链将需要实现上述代码。

在GameMenu.m中的initButtons方法中,将每个按钮的下一个响应者设置为

chordAttackButton.nextResponder = self;
noteBlasterButton.nextResponder = self;
在Button类中,通过将鼠标向下/向上事件传递到响应程序链

-(void)mouseDown:(NSEvent *)theEvent {
    [self setButtonState:@"mousedown"];
    [super mouseDown:theEvent];
}

-(void)mouseUp:(NSEvent *)theEvent {
    [self setButtonState:@"mouseup"];
    [super mouseUp:theEvent];
}

你是怎么做到的?我试过这个,但它给了我一个错误<代码>chordAttackButton.acceptsFirstResponder=true[self setNextResponder:referenceToGameScene]; [self.nextResponder theEvent];
chordAttackButton.nextResponder = self;
noteBlasterButton.nextResponder = self;
-(void)mouseDown:(NSEvent *)theEvent {
    [self setButtonState:@"mousedown"];
    [super mouseDown:theEvent];
}

-(void)mouseUp:(NSEvent *)theEvent {
    [self setButtonState:@"mouseup"];
    [super mouseUp:theEvent];
}