16

UIDatePicker に年のみを表示する方法はありますか?

4

6 に答える 6

15

削除しようとしていたコードが少しありますが、スニペットはオンラインのどこかにある方が良いでしょう。驚くほどではありませんが、検索可能です。

1960 年以降のすべての年の配列を作成する Objective-C コード。への入力に最適UIPicker

//Get Current Year into i2
NSDateFormatter* formatter = [[[NSDateFormatter alloc] init]autorelease];
[formatter setDateFormat:@"yyyy"];
int i2  = [[formatter stringFromDate:[NSDate date]] intValue];


//Create Years Array from 1960 to This year
years = [[NSMutableArray alloc] init];
for (int i=1960; i<=i2; i++) {
    [years addObject:[NSString stringWithFormat:@"%d",i]];
}

UIPickerViewデータ ソースとデリゲート メソッド:

- (NSInteger)numberOfComponentsInPickerView: (UIPickerView*)thePickerView {
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component
{
    return [years count];
}
- (NSString *)pickerView:(UIPickerView *)thePickerView
titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return [years objectAtIndex:row];
}

インターフェイスでの宣言を忘れないでください

//Data
NSMutableArray *years;

そのアウトプットは

ここに画像の説明を入力

ここから引用

于 2012-08-18T10:47:48.143 に答える
5

ではできませんがUIDatePicker、 ではできますUIPicker

年の配列を作成し、デリゲートUIPickerを使用してそれらをに追加する必要がありますUIPicker

ここにチュートリアルがあります。

于 2012-08-18T10:30:13.483 に答える
3

コメントはできませんが、Wolvorin の回答をいじっていたので、最近の年がピッカーの一番上になるようにすることにしました。現在、彼のコードは最も古いものから最近のものへと移動します。

私が変更したのは、彼の代わりに viewDidLoad の NSMutableArray セットアップだけでした。

//Create Years Array from 1960 to This year
years = [[NSMutableArray alloc] init];
for (int i=1960; i<=i2; i++) {
    [years addObject:[NSString stringWithFormat:@"%d",i]];
}

私が使用した:

years = [[NSMutableArray alloc] init];
for (int i1=i2; i1<=i2 & i1>=1920; i1--) {
    [years addObject:[NSString stringWithFormat:@"%d",i1]];
}

これは、最新の日付から逆の順序で for を実行し、1920 年になるまで 1 年を減算 (および配列に加算) します。

私の式:

int i1=i2; i1<=i2 & i1>=1920; i1--
于 2012-09-14T00:51:49.517 に答える
3

年月のみの設定はできません。これらのモードのみが iOS 13.5.1 で利用可能です

  • time: 日付を時間、分、および (オプションで) AM/PM の指定で表示するモード。表示される正確なアイテムとその順序は、ロケール セットによって異なります。このモードの例は [ 6 | 53 | 午後]。

  • date: 日付を月、日、年で表示するモード。これらの項目の正確な順序は、ロケール設定によって異なります。このモードの例は [ 11 月 | 11 月 ] です。15 | 2007]。

  • dateAndTime: 日付を統一された曜日、月、日の値に加えて、時間、分、および (オプションで) AM/PM の指定として表示するモード。これらの項目の正確な順序と形式は、ロケール セットによって異なります。このモードの例は [ 11 月 15 日水曜日 | 6 | 53 | 午後]。

  • countDownTimer: 時間と分の値を表示するモード。たとえば [ 1 | 53]。アプリケーションは、適切な間隔で起動するようにタイマーを設定し、秒単位で日付ピッカーを設定する必要があります。UIDatePicker.Mode - developer.apple.com


カスタム UIPickerView を使用してビルドできます。

class DatePickerViewController: UIViewController {
    var dates =  [Date]()
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
        
        
        var date = Date().addYear(n: -10)
        let endDate = Date().addYear(n: 10)
        
        repeat {
            date = date.addMonth(n: 1)
            dates.append(date)
        } while date < endDate
        
        
        let picker = UIPickerView()
        picker.dataSource = self
        picker.delegate = self
        picker.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(picker)
        
        picker.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        picker.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
        picker.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
        picker.heightAnchor.constraint(equalToConstant: 500).isActive = true
    }
}


extension  DatePickerViewController: UIPickerViewDataSource {
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return self.dates.count
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        let date = self.dates[row]
        return date.stringDate()
    }
    
    func view(forRow row: Int, forComponent component: Int) -> UIView? {
        let label =  UILabel()
        return label
    }
}

extension  DatePickerViewController: UIPickerViewDelegate {
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        let date = self.dates[row]
        // Date that the user select. 
        print( date, date.stringDate())
    }
}


extension Date {
    public  func addYear(n: Int) -> Date {
        let calendar = Calendar.current
        return calendar.date(byAdding: .year, value: n, to: self)!
    }
    
    public  func addMonth(n: Int) -> Date {
        let calendar = Calendar.current
        return calendar.date(byAdding: .month, value: n, to: self)!
    }
    
    public  func stringDate() -> String {
        let calendar  = Calendar.current
        let dateFormatter = DateFormatter()
        
        dateFormatter.timeZone = calendar.timeZone
        dateFormatter.locale = calendar.locale
        // Use YYYY to show year only. 
        // Use MMMM to show month only. 
        dateFormatter.setLocalizedDateFormatFromTemplate("MMMM YYYY")
        
        let dateString = dateFormatter.string(from: self)
        return dateString
    }
}

次の 2 行を変更するだけです。表示したい年数を足したり引いたりしてください。

var date = Date().addYear(n: -10) 
let endDate = Date().addYear(n: 10)

于 2020-07-05T21:21:36.400 に答える