3

ENTER キーを押したとき、または TAB キーを使用してファーストレスポンダーを作成したときに、NSTokenField がすべてを選択するのを防ぐ方法はありますか?

4

1 に答える 1

7

NSTokenField は NSTextField のサブクラスです。これらのクラスの選択を直接操作する簡単で直接的な方法はありません (すべてを選択する -selectText: を除く)。

ファーストレスポンダーになったときにこれを行うには、NSTokenField をサブクラス化し (XIB のフィールドのクラスをカスタム サブクラスのクラスに設定することを忘れないでください)、次のように -becomeFirstResponder をオーバーライドする必要があります。

- (BOOL)becomeFirstResponder
{
    if ([super becomeFirstResponder])
    {
        // If super became first responder, we can get the
        // field editor and manipulate its selection directly
        NSText * fieldEditor = [[self window] fieldEditor:YES forObject:self];
        [fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length], 0)];
        return YES;
    }
    return NO;
}

このコードはまず、super が「yes」と応答するかどうかを確認します (そして最初のレスポンダーになります)。その場合、フィールド エディター (NSText インスタンス) があり、その選択内容を直接操作できることがわかります。そのため、フィールド エディターを取得し、選択範囲を設定します (挿入ポイントを { lastchar, nolength } 範囲の最後に置きます)。

フィールドの編集 (リターン、タブアウトなど) が完了したときにこれを行うには、次のように -textDidEndEditing: をオーバーライドします。

- (void)textDidEndEditing:(NSNotification *)aNotification
{
    [super textDidEndEditing:aNotification];
    NSText * fieldEditor = [[self window] fieldEditor:YES forObject:self];
    [fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length], 0)];
}

この場合、ユーザーが編集を終了すると、このメソッドは super に処理を任せてから、自分がまだファーストレスポンダであるかどうかを確認します。そうであれば、上記と同じことを行います: 挿入カラットをフィールドの最後に置きます。

この動作は標準ではなく、予期しないことに注意してください。控えめに使用してください。

于 2010-06-09T18:15:13.830 に答える