Как можно использовать клавиши со стрелками для графического NSDatePicker?

Это кажется простым, но необходимым.

Поместите NSDatePicker (стиль: графический) в окно, создайте и запустите, затем попытайтесь использовать клавиши со стрелками для перемещения. Единственный ответ - "динь" с компьютера.

Я переопределил -keydown в простом пользовательском подклассе NSDatePicker и напечатали событие, чтобы заметить, что они имеют соответствующие коды клавиш от 123 до 126.

Затем я наткнулся на сброс даты выбора даты после каждого нажатия кнопки со стрелкой, внутри -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 ...
    }
}

Реализация этого метода имеет побочный эффект удаления клавиши "tab" для перехода по объектам.

Это похоже на большой обходной путь. Есть ли другой способ уже включен в сборщик даты?

1 ответ

Решение

Я понимаю, что этот вопрос действительно старый, но я просто работал над этим, так что... Приведенный ниже подход работает для меня.

- (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. Пользовательская текстовая ячейка обрабатывает сочетания клавиш ("replaceKey"), изменяя выбранную дату, например:

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];
}
Другие вопросы по тегам