如何仅在 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 的仅限年份的变体。我还请求了一年中的一周选择器。
我只想在 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 的仅限年份的变体。我还请求了一年中的一周选择器。