2

好的,这是我的情况:

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

这是最后的方法:

- (void)handleConsoleInput:(NSNotification*)not

每当(至少从我注意到的)用户时触发此通知:

  • 按下“返回”
  • 按“标签”
  • 点击次数NSTextField

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

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

有任何想法吗?


编辑:

刚刚注意到:

  • 当用户点击NSTextField[[not userInfo] valueForKey:@"NSTextMovement"]变成0表示可以过滤这种情况。
  • 但是,如何区分“tab”和“return”,它们都返回NSTextMovement>0
4

2 回答 2

4

如果您真的觉得订阅通知是解决此问题的最有效方式,那么您将获得更多权力,但我觉得您将 NSTextField 子类化并覆盖相关事件方法会更容易。但是,没关系,这是我认为它应该是什么样子的快速实现:

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

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

于 2013-03-03T09:08:34.450 回答
2

的可能值

NSDictionary *userInfo = [notification userInfo];
int movement = [[userInfo objectForKey:@"NSTextMovement"] intValue];

其中的在“NSText 类参考”NSTextDidEndEditingNotification中记录为运动代码:

enum {
   NSIllegalTextMovement = 0,
   NSReturnTextMovement  = 0x10,
   NSTabTextMovement     = 0x11,
   NSBacktabTextMovement = 0x12,
   NSLeftTextMovement    = 0x13,
   NSRightTextMovement   = 0x14,
   NSUpTextMovement      = 0x15,
   NSDownTextMovement    = 0x16,
   NSCancelTextMovement  = 0x17,
   NSOtherTextMovement    = 0
};
于 2013-03-03T09:04:03.640 回答