0

これは単純に思えますが、不可欠です。

NSDatePicker (スタイル: グラフィカル) をウィンドウに配置し、ビルドして実行し、矢印キーを使用して移動しようとします。唯一の応答は、コンピューターからの「ディン」です。

単純なカスタム NSDatePicker サブクラスでオーバーライド-keydownし、theEvent を出力して、対応する 123 ~ 126 の keyCode があることを確認しました。

-keydown次に、次のように、矢印ボタンを押すたびに日付ピッカーの日付をリセットすることに遭遇しました。

- (void)keyDown:(NSEvent *)theEvent
    switch ([[theEvent valueForKey:@"keyCode"] integerValue]) {
        case 126:
            // Take away one week from the date
            self.dateValue = [NSDate dateWithTimeInterval:-604800 sinceDate:self.dateValue];
            break;
        .... similar for 125 - 123 ...
    }
}

このメソッドを実装すると、オブジェクトをステップ実行するための「タブ」キーが不要になるという副作用があります。

これは大きな回避策のようです。日付ピッカーに既に含まれている別の方法はありますか??

4

1 に答える 1

0

この質問は本当に古いと思いますが、私はちょうどこれに取り組んでいたので... 以下のアプローチは私にとってはうまくいきます。

- (void)keyDown:(NSEvent *)theEvent
{
    NSString* replacementKey = nil;

    switch ([theEvent keyCode])
    {
        case 123:    // Left arrow
            replacementKey = @"-";
            break;
        case 124:    // Right arrow
            replacementKey = @"+";
            break;
        case 125:    // Down arrow
            replacementKey = @"]";
            break;
        case 126:    // Up arrow
            replacementKey = @"[";
            break;
        case 53: // esc
        case 36: // return  -- don't assign replacement key and these will dismiss date picker
            break;

        default:
            replacementKey = [theEvent charactersIgnoringModifiers];
            break;
    }

    if (replacementKey) // 'letter' based shortcut keys
    {
        [self.textFieldCell dateShortcut:replacementKey];
        [self updateGraphicalCalendar];
    }
    else
    {       
        [self.textFieldCell hidegraphicCalendar];
    }
}

これは、カスタム NSTextFieldCell に関連付けられたグラフィカルな日付ピッカー用であることに注意してください。カスタム textfieldcell は、選択した日付を次のように変更することで、ショートカット キー (「replacementKey」) を処理します。

if (NSOrderedSame == [shortcut caseInsensitiveCompare:@"+"] || NSOrderedSame == [shortcut caseInsensitiveCompare:@"="]) // '=' is unshifted '+'
{
    emptyComponents.day = 1;
    currentDateValue = [calendar dateByAddingComponents:emptyComponents toDate:currentDateValue options:0];
}

else if (NSOrderedSame == [shortcut caseInsensitiveCompare:@"-"])
{
    emptyComponents.day = -1;
    currentDateValue = [calendar dateByAddingComponents:emptyComponents toDate:currentDateValue options:0];
}

else if (NSOrderedSame == [shortcut caseInsensitiveCompare:@"["]) // same day in previous week
{
    emptyComponents.day = -7;
    currentDateValue = [calendar dateByAddingComponents:emptyComponents toDate:currentDateValue options:0];
}

else if (NSOrderedSame == [shortcut caseInsensitiveCompare:@"]"]) // same day in next week
{
    emptyComponents.day = 7;
    currentDateValue = [calendar dateByAddingComponents:emptyComponents toDate:currentDateValue options:0];
}
于 2014-06-06T02:19:33.960 に答える