UIDatePicker仅显示年份

时间:2012-08-18 10:25:49

标签: iphone objective-c ios

有没有办法让UIDatePicker只显示年份?

6 个答案:

答案 0 :(得分:15)

我有一些我即将删除的代码,但如果它在某个地方在线,那么代码段会更好。这并不奇怪,但它是可以搜索的!

Objective-C代码,用于创建自1960年以来所有年份的数组。非常适合输入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;

它的输出是

enter image description here

引自here

答案 1 :(得分:5)

您无法使用UIDatePicker执行此操作,但可以使用UIPicker

您需要创建多年的数组,并使用UIPicker代理人将其添加到UIPicker

Here是一个教程。

答案 2 :(得分:3)

我无法发表评论,但是我正在玩Wolvorin的答案,我决定采用最近一年处于Picker顶端的方式。目前,他的代码最早到最近几年。

我所有的更改都是在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]];
}

以相反的顺序从最近的日期开始,然后减去一年(并将其添加到数组),直到它达到1920.

我的公式:

int i1=i2; i1<=i2 & i1>=1920; i1--

答案 3 :(得分:3)

不能仅设置年和月。从iOS 13.5.1开始只有这些模式可用

  • 时间:一种以小时,分钟和(可选)AM / PM名称显示日期的模式。显示的确切项目及其 顺序取决于语言环境集。此模式的一个示例是[6 | 53 | PM]。

  • 日期:一种显示日期的模式,以月,月中的天和年为单位。这些项目的确切顺序取决于地区 设置。此模式的一个示例是[November | 15 | 2007]。

  • dateAndTime:一种将日期显示为统一的星期几,月份和月份中的日期值以及小时,分钟和 (可选)AM / PM名称。这些的确切顺序和格式 项目取决于语言环境集。这种模式的一个例子是[ 15 | 6 | 53 | PM]。

  • 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
    }
}

只需更改以下两行-加/减您希望显示的年份。

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

答案 4 :(得分:1)

只需使用 Swift 3

更新此帖中的现有答案
var yearsTillNow : [String] {
    var years = [String]()
    for i in (1970..<2018).reversed() {
        years.append("\(i)")
    }
    return years
}

只需将此用于UIPickerView数据源。

答案 5 :(得分:0)

我略微更改了Sharukh Mastan的代码,以始终将当前年份显示在最前面。

var formattedDate: String? = ""

let format = DateFormatter()
format.dateFormat = "yyyy"
formattedDate = format.string(from: date)

var yearsTillNow: [String] {
    var years = [String]()
    for i in (Int(formattedDate!)!-70..<Int(formattedDate!)!+1).reversed() {
        years.append("\(i)")
    }
    return years
}

print(yearsTillNow)

这将打印一系列可追溯到70年的年份,您可以将其用作UIPickerView数据源