具有鼠标向下/向上和向下/向下键的NSButton

tho*_*zel 4 macos cocoa nsbutton

我需要一个NSButton,它给我2个事件,一个按下按钮(NSOnState),一个按钮被释放(NSOffState),到目前为止我已经使用鼠标(拦截mouseDown:事件).但是使用键盘快捷键不起作用,它会触发一次NSOnState,然后经常延迟一次.是否有任何方法可以获得按下按钮时按下NSOnState并释放NSOffState?

我当前的NSButton子类看起来像这样,不幸的是使用委托:

-(void)awakeFromNib {
    [self setTarget:self];
    [self setAction:@selector(buttonAction:)];
}

-(void)mouseDown:(NSEvent *)theEvent {
    [_delegate button:self isPressed:YES];
    [super mouseDown:theEvent];
}

-(void)buttonAction:(id)sender {
    [_delegate button:self isPressed:NO];
}
Run Code Online (Sandbox Code Playgroud)

tsn*_*rri 6

可以将按钮设置为使用-sendActionOn:以下两种方式发送鼠标事件:

[self.button sendActionOn: NSLeftMouseDownMask | NSLeftMouseUpMask];
Run Code Online (Sandbox Code Playgroud)

处理键盘事件同样似乎更难.如果您不需要事件同时从按钮中删除突出显示,则可以覆盖NSButton,-performKeyEquivalent:以便它例如发送动作两次.

- (BOOL) performKeyEquivalent: (NSEvent *) anEvent
{
    if ([super performKeyEquivalent: anEvent])
    {
        [self sendAction: self.action to: self.target];
        return YES;
    }
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

如果你确实需要同时进行该事件,我认为你需要使用自定义按钮单元格(通过创建NSButtonCell的子类并在初始化程序中设置按钮的单元格)并覆盖它-highlight:withFrame:inView::

- (void)highlight:(BOOL)flag
        withFrame:(NSRect)cellFrame
           inView:(NSView *)controlView
{
    [super highlight: flag withFrame:cellFrame inView:controlView];

    if (flag)
    {
        // Action hasn't been sent yet.
    }
    else
    {
        // Action has been sent.
    }
}
Run Code Online (Sandbox Code Playgroud)