我需要一个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];
}
答案 0 :(得分:7)
可以将按钮设置为使用-sendActionOn:
:
[self.button sendActionOn: NSLeftMouseDownMask | NSLeftMouseUpMask];
同样处理键盘事件似乎更加困难。如果您不需要完全同时从按钮中删除突出显示事件,则可以覆盖NSButton的-performKeyEquivalent:
,以便它可以例如发送动作两次。
- (BOOL) performKeyEquivalent: (NSEvent *) anEvent
{
if ([super performKeyEquivalent: anEvent])
{
[self sendAction: self.action to: self.target];
return YES;
}
return NO;
}
如果您确实需要同时进行该事件,我认为您需要使用自定义按钮单元格(通过创建NSButtonCell的子类并在初始化程序中设置按钮的单元格)并覆盖其-highlight:withFrame:inView:
:< / p>
- (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.
}
}