NSDatePicker でのみ年コンポーネントを表示したい。
NSDateFormatter を NSDatePicker に設定/追加しようとしましたが、うまくいきませんでした。(NSDateFormatter を nib の NSDatePicker にドラッグすることにより)
NSDatePicker または NSTextField をサブクラス化せずにこれを達成する方法はありますか? ありがとうございました!
NSDatePicker でのみ年コンポーネントを表示したい。
NSDateFormatter を NSDatePicker に設定/追加しようとしましたが、うまくいきませんでした。(NSDateFormatter を nib の NSDatePicker にドラッグすることにより)
NSDatePicker または NSTextField をサブクラス化せずにこれを達成する方法はありますか? ありがとうございました!
Apple のドキュメントに飛び込んだ後、解決策を見つけたので、他の人に役立つ場合に備えて、ここに投稿したいと思います。
をサブクラス化する必要はありません。日付ピッカーが表示する要素を指定NSDatePicker
するメソッドがあります。elementFlagsは、次のように列挙型で定義される定数です。- (void)setDatePickerElements:(NSDatePickerElementFlags)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 のインスタンスです。
結果は次のとおりです。
Interface yearOnlyDatePicker
Builder では次のようになります。
アプリyearOnlyDatePicker
の実行時は次のようになります。
NSDatePicker を使用する必要がないのは簡単です。必要な年の範囲を作成し、datasource
通常のピッカーと同じように使用するだけです。
for (int i=1900; i<=currentYear; i++) {
[_yourDataSourceArr addObject:[NSString stringWithFormat:@"%d",i]];
}
-[NSDatePicker setDatePickerElements:]
だまされて年のみを表示することはできなくなりました。
年のみの NSDatePicker は、年月ピッカーを構成し、NSDatePickerCell をサブクラス化して月と区切りフィールドを作成しないようにすることで取得できます。
- (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
}
NSDatePicker の年限定版をリクエストするには、Apple にバグ レポートを提出してください。週のピッカーもリクエストしました。