1

NSDatePicker でのみ年コンポーネントを表示したい。

NSDateFormatter を NSDatePicker に設定/追加しようとしましたが、うまくいきませんでした。(NSDateFormatter を nib の NSDatePicker にドラッグすることにより)

NSDatePicker または NSTextField をサブクラス化せずにこれを達成する方法はありますか? ありがとうございました!

4

3 に答える 3

2

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];

_yearOnlyPickerNSDatePicker のインスタンスです。


結果は次のとおりです。

Interface yearOnlyDatePickerBuilder では次のようになります。

インターフェイスビルダーで。

アプリ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:]だまされて年のみを表示することはできなくなりました。

年のみの 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 にバグ レポートを提出してください。週のピッカーもリクエストしました。

于 2018-07-16T16:00:09.137 に答える