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

时间:2014-12-05 12:58:29

标签: objective-c macos cocoa interface-builder

我有NSWindow主要" OK"按钮。此按钮具有"等效键#34;接口构建器中的属性,键 ENTER ,即

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

但是,当我按Enter键时,主按钮会收到通知并关闭窗口。如何防止这种情况?

3 个答案:

答案 0 :(得分:2)

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

添加以下NSComboBox代理:

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


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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

首先,我删除了所有“关键等价物”。我曾经使用+ (void)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent *(^)(NSEvent *))blockNSEvent方法检测 Enter 键。您将块作为参数传递,您可以在其中检查某些条件。第一个参数是事件掩码。对于您的任务,它将是NSKeyDownMask,在NSEvent Reference Page

寻找其他面具

每次用户按下按钮时,参数块都会执行。你应该检查它是否是正确的按钮,并且 - 通常 - 如果当前窗口的第一响应者不是某个可编辑的控件。为此,我们需要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];
}
祝你好运。