2

OK、この私の状況:

  • 私は使用していますNSTextField
  • NSTextDidEndEditingNotification通知を監視しています

これが最終的な方法です:

- (void)handleConsoleInput:(NSNotification*)not

この通知は、(少なくとも私が気付いたことから) ユーザーが次の場合に発生します。

  • 「戻る」を押します
  • 「タブ」を押す
  • クリックアウトNSTextField

ただし、(明らかに)「リターン」キーに限定したいと思います。

どうすればいいですか?送信されたオブジェクトの内容をテストしましたが、通知NSNotificationをトリガーしたキー コードまたはイベントに関する情報はありません。textDidEndEditing:

何か案は?


編集:

ただ気づいた:

  • ユーザーが をクリックすると、NSTextField[[not userInfo] valueForKey:@"NSTextMovement"]なります。0これは、このケースをフィルタリングできることを意味します。
  • ただし、どちらも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 に答える