有没有办法让 UIDatePicker 只显示一年?
6 回答
我有一些我要删除的代码,但是如果它在某个地方在线,那么这个片段会更好。这并不奇怪,但它是可搜索的!
用于创建自 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;
它的输出是
从这里引用
我无法发表评论,但我在玩弄 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]];
}
从最近的日期开始以相反的顺序执行 for,然后减去一年(并将其添加到数组中)直到 1920 年。
我的公式:
int i1=i2; i1<=i2 & i1>=1920; i1--
只需使用Swift 3更新这篇文章中的现有答案:
var yearsTillNow : [String] {
var years = [String]()
for i in (1970..<2018).reversed() {
years.append("\(i)")
}
return years
}
只需将其用于您的UIPickerView
数据源。
不能只设置年和月。自 iOS 13.5.1 起仅这些模式可用
时间:以小时、分钟和(可选)AM/PM 名称显示日期的模式。显示的确切项目及其顺序取决于区域设置。这种模式的一个例子是 [ 6 | 53 | 下午]。
date:一种以月、月中的天数和年数显示日期的模式。这些项目的确切顺序取决于区域设置。这种模式的一个例子是 [ 十一月 | 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
}
}
只需更改以下两行 - 添加/减去您希望显示的年份。
var date = Date().addYear(n: -10)
let endDate = Date().addYear(n: 10)
我稍微更改了 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 数据源