如何仅在 NSDatePicker 中显示年份

How to show year only in NSDatePicker

我只想在 NSDatePicker 中显示年份组件。

我尝试 set/add NSDateFormatter 到 NSDatePicker,但没有成功。 (通过在nib中拖拽一个NSDateFormatter到NSDatePicker)

有没有办法在不子类化 NSDatePicker 或 NSTextField 的情况下实现这一点?谢谢!

很容易你不需要使用 NSDatePicker。您所要做的就是创建一个您想要的年份范围,并将其用作普通选择器的 datasource

for (int i=1900; i<=currentYear; i++) {
  [_yourDataSourceArr addObject:[NSString stringWithFormat:@"%d",i]];
}

深入研究 Apple 的文档后,我找到了解决方案并想post这里,以防对其他人有用。

无需子类 NSDatePicker,有一个方法 - (void)setDatePickerElements:(NSDatePickerElementFlags)elementFlags 指定日期选择器将显示哪个元素。 elementFlags 是一个常量,由枚举定义为:

enum {
   NSHourMinuteDatePickerElementFlag       = 0x000c,
   NSHourMinuteSecondDatePickerElementFlag = 0x000e,
   NSTimeZoneDatePickerElementFlag         = 0x0010,
   NSYearMonthDatePickerElementFlag        = 0x00c0,
   NSYearMonthDayDatePickerElementFlag     = 0x00e0,
   NSEraDatePickerElementFlag              = 0x0100,
};
typedef NSUInteger NSDatePickerElementFlags;

在查看这些常量时,我​​发现它只是一个位掩码。位的位置和对应的日历元素如下:

15 - 9 位:未知。可能没用过。

8位:纪元。 (如果有 4 位数的年份格式,则不会显示任何内容。)

7位:年

6位:月

5位:日。

4位:时区。

3位:小时。

2位:分钟。

1位:秒。

0位:未知。可能是毫秒,或者未使用。

因此,以下行将给我一个仅限年份的日期选择器:

[_yearOnlyDatePicker setDatePickerElements:0x0080];

_yearOnlyPicker 是 NSDatePicker 的实例。


这是结果:

yearOnlyDatePicker 在 Interface Builder 中的样子:

当 运行 应用时 yearOnlyDatePicker 的样子:

-[NSDatePicker setDatePickerElements:] 不能再被欺骗只显示年份。

可以通过配置年月选择器并子类化 NSDatePickerCell 以防止它创建月份和分隔符字段来获得仅限年份的 NSDatePicker:

- (void)_addSubfieldForElement:(int)arg1 withDateFormat:(id)arg2 referenceStrings:(id)arg3
{
    if ((arg1 == 6) || (arg1 == 100)) {
        return;
    }

    [super _addSubfieldForElement:arg1 withDateFormat:arg2 referenceStrings:arg3]; // Private API
}

请向 Apple 提交错误报告,以请求 NSDatePicker 的仅限年份的变体。我还请求了一年中的一周选择器。