繁体   English   中英

NSWindow,按下ENTER键:如何限制关注集中监听NSControl的键?

[英]NSWindow, press key ENTER: how to limit the key listening to the focused NSControl?

我有一个带有主“OK”按钮的NSWindow 此按钮在界面构建器中具有“等效键”属性,键为ENTER

它运行良好,但现在我有一个新的NSComboBox ,它应该在用户选择列表项时调用方法,或者他提出Enter /

但是,当我按Enter键时,主按钮会收到通知并关闭窗口。 怎么预防这个?

这是你得到的正常行为,但你可以通过删除和添加密钥等效来破解。

添加以下NSComboBox代理:

- (void)comboBoxWillPopUp:(NSNotification *)notification;{
    [self.closeButton setKeyEquivalent:@""];
}


- (void)comboBoxWillDismiss:(NSNotification *)notification;{
    [self.closeButton setKeyEquivalent:@"\r"];
}

您可以解决阻止输入通知的一种方法如下: -

//将此操作方法连接到组合框,并在其中将一个BOOL标志设置为yes

- (IBAction)comBoxItm:(id)sender
{
    self.isEnterCalled=YES;
}

//现在将此标志检查到调用关闭窗口的某个方法

-(void)someMethod
{
//Check the flag value if it is yes then just ignore it
if (!self.isEnterCalled)
{
//Close window logic
}
self.isEnterCalled=NO;
}

陷入同样的​​问题。 有“热键”,我想在编辑一些文本字段时关闭它。 我为自己找到了解决方案。 没有必要覆盖很多NSTextField基本方法。

首先,我删除了所有“关键等价物”。 我用于检测回车键打倒+ (void)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent *(^)(NSEvent *))block的类方法NSEvent 您将块作为参数传递,您可以在其中检查某些条件。 第一个参数是事件掩码。 对于您的任务,它将是NSKeyDownMask ,在NSEvent参考页面中查找其他掩码

每次用户按下按钮时,参数块都会执行。 你应该检查它是否是正确的按钮,并且 - 通常 - 如果当前窗口的第一响应者不是某个可编辑的控件。 为此目的,我们需要NSWindow类别类,以便每次处理NSKeyDownMask ed本地监视器时都不实现此代码。

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];
}

祝好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM