textDidEndEditing: - 如何过滤“返回”键?

时间:2013-03-03 08:46:59

标签: objective-c macos cocoa nstextfield

好的,这是我的情况:

  • 我正在使用NSTextField
  • 我正在观察NSTextDidEndEditingNotification通知

这是最后一种方法:

- (void)handleConsoleInput:(NSNotification*)not

每当(至少从我注意到的)用户开始发出此通知:

  • 按“返回”
  • 按“tab”
  • 点击NSTextField

但是,我(显然)希望将其限制为“返回”键。

我该怎么做?我已经测试了发送的NSNotification对象的内容,并且没有关于触发textDidEndEditing:通知的密钥代码或事件的信息。

有什么想法吗?


修改

刚注意到:

  • 当用户点击NSTextField时,[[not userInfo] valueForKey:@"NSTextMovement"]变为0,这意味着此案例可以进行过滤。
  • 如何区分“标签”和“返回”,哪些都返回NSTextMovement>0

2 个答案:

答案 0 :(得分:3)

如果您确实认为订阅通知是最有效的方式,那么您可以获得更多权力,但我觉得您可以更轻松地将NSTextField子类化并覆盖相关的事件方法。但是,这无关紧要,这里是我认为应该是这样的快速实现:

- (void)handleConsoleInput:(NSNotification*)notification {
    NSUInteger textMove = [notification.userInfo[@"NSTextMovement"] unsignedIntegerValue];
    if (textMove != NSReturnTextMovement) {
        [self.window makeFirstResponder:notification.object];
    }
}

结束事件的类型在NSText的文档中列举。

答案 1 :(得分:2)

的可能值
NSDictionary *userInfo = [notification userInfo];
int movement = [[userInfo objectForKey:@"NSTextMovement"] intValue];
NSTextDidEndEditingNotification中的

在“NSText类参考”中记录为Movement Codes

enum {
   NSIllegalTextMovement = 0,
   NSReturnTextMovement  = 0x10,
   NSTabTextMovement     = 0x11,
   NSBacktabTextMovement = 0x12,
   NSLeftTextMovement    = 0x13,
   NSRightTextMovement   = 0x14,
   NSUpTextMovement      = 0x15,
   NSDownTextMovement    = 0x16,
   NSCancelTextMovement  = 0x17,
   NSOtherTextMovement    = 0
};