1

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

我尝试将 NSDateFormatter 设置/添加到 NSDatePicker,但没有运气。(通过将 NSDateFormatter 拖到 nib 中的 NSDatePicker 中)

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

4

3 回答 3

2

在深入了解 Apple 的文档后,我找到了解决方案并想在此处发布它,以防它对其他人有用。

不需要子类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 的一个实例。


结果如下:

yearOnlyDatePickerInterface Builder 中的样子:

在界面生成器中。

运行应用程序yearOnlyDatePicker时的样子:

运行应用程序时。

于 2016-12-26T03:46:26.733 回答
1

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

for (int i=1900; i<=currentYear; i++) {
  [_yourDataSourceArr addObject:[NSString stringWithFormat:@"%d",i]];
}
于 2016-12-21T02:45:20.180 回答
1

-[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 变体。我还请求了一年中的一周选择器。

于 2018-07-16T16:00:09.137 回答