有没有办法让UIDatePicker只显示年份?
答案 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;
它的输出是
引自here
答案 1 :(得分:5)
答案 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数据源