0

这看起来很简单,但必不可少。

将 NSDatePicker(样式:图形)放入窗口,构建并运行,然后尝试使用箭头键四处移动。唯一的反应是计算机发出“叮”的一声。

我已经覆盖-keydown了一个简单的自定义 NSDatePicker 子类并打印了 theEvent 以注意到它们具有从 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 ...
    }
}

实现此方法的副作用是取消了用于单步执行对象的“制表符”键。

这似乎是一个很大的解决方法。日期选择器中是否已经包含另一种方法?

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 回答