遇到了同样的问题。有“热键”,我想在编辑一些文本字段时关闭它。我为自己找到了解决方案。无需重写大量 NSTextField 基方法。
首先,我删除了所有“关键等效项”。我曾经使用NSEvent 的+ (void)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent *(^)(NSEvent *))block 类方法检测Enter 键。您将块作为参数传递,您可以在其中检查某些条件。第一个参数是事件掩码。你的任务是NSKeyDownMask,在NSEvent Reference Page寻找其他掩码
参数块将在用户每次按下按钮时执行。您应该检查它是否按下了右键,并且 - 通常 - 当前窗口的第一响应者不是一些可编辑的控件。为此,我们需要 NSWindow 类别类,只是不要在每次处理 NSKeyDownMasked 本地监视器时实现此代码。
NSWindow+Responders类列表:
@interface NSWindow (Responders)
- (BOOL)isEditableFirstResponder;
@end
@implementation NSWindow (Responders)
- (BOOL)isEditableFirstResponder
{
if (!self.firstResponder)
return NO; // no first responder at all
if ([self.firstResponder isKindOfClass:[NSTextField class]]) // NSComboBox is NSTextField subclass
{
NSTextField *field=(NSTextField *)self.firstResponder;
return field.isEditable;
}
if ([self.firstResponder isKindOfClass:[NSButton class]]) // yep, buttons may be responders
return YES;
return NO; // the first responder is not NSTextField or NSButton subclass - not editable
}
@end
不知道是否有其他方法可以检查我们现在是否正在编辑某些文本字段或组合框。所以,至少有一部分是你在类的某个地方添加本地监视器(NSWindow、NSView、一些控制器等)。
- (void)someMethod
{
id monitor=[NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:(NSEvent *)^(NSEvent *theEvent){
if (theEvent.keyCode==/*Enter key code*/ && ![self.window.isEditableFirstResponder]) // you should check the key modifiers too
{
// your code here
}
return theEvent; // you may return the event to pass the key to the receiver
}];
}
本地监视器是有关 Apple 规则的安全补救措施。它仅在您的应用程序内部有效。对于全局按键事件,您可以使用 addGlobalMonitor,但 Apple 可能会从 AppStore 拒绝您的应用。
并且不要忘记在不需要时移除显示器。
- (void)viewControllerShutdownMethod
{
[NSEvent removeMonitor:monitor];
}
祝你好运。