Как можно использовать клавиши со стрелками для графического 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];
}