オートコンプリート付きの単一行の NSTextField があります。テキストを入力し、リターンを押して処理したい。オートコンプリートの提案が必要ない場合は、私が望むことをまったく実行しないことを除けば、ほとんど問題なく動作します。
その場合、何かを入力し、最初に Return キーを押すと、オートコンプリート ドロップダウンが消えます。編集を終了してテキストを処理するには、2 回目のリターン キーを押す必要があります。ドロップダウンを閉じてテキストを処理するためにリターンキーを1回押すだけでよい場合は、それをお勧めします。
ドロップダウンがリターンキーの押下を飲み込んでいるようです。フィールド エディターの keyDown: および insertText: メソッドは、ドロップダウンが表示されたときに英数字キー イベントを認識しますが、ドロップダウンを閉じる最初のリターン キーの押下を登録しません。ドロップダウンが閉じられた後、リターンキーの押下を登録します。
リターン キーを 2 回押す必要がないようにする方法はありますか?
編集:いくつかのコードを追加しました:
#import "JWAppDelegate.h"
@interface JWAppDelegate()
@property (readwrite, strong) IBOutlet NSTextField *inputTextField;
@property (readwrite, strong) IBOutlet NSTextField *outputTextField;
@end
@implementation JWAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[self.inputTextField setDelegate:self];
}
- (IBAction)textUpdated:(id)sender
{
[self.outputTextField setStringValue:[@"User typed: " stringByAppendingString:[sender stringValue]]];
}
#pragma mark NSTextFieldDelegate
- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index
{
// Select nothing in the autocomplete list.
*index = -1;
return @[@"foobar", @"foobaz", @"fooqaz"];
}
@end
nib ファイルには、入力テキスト フィールドと読み取り専用の出力テキスト フィールドがあります。リターンキーを押さずに入力に「hello」と入力します。Esc を押して、オートコンプリート オプションを表示します。ここで、オートコンプリート オプションを選択せずに Return キーを押します。この時点で呼び出されたいのですtextUpdated:
が、これを行うにはさらにリターン キーを押す必要があります。