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;
そのアウトプットは
ここから引用
ではできませんがUIDatePicker
、 ではできますUIPicker
。
年の配列を作成し、デリゲートUIPicker
を使用してそれらをに追加する必要がありますUIPicker
ここにチュートリアルがあります。
コメントはできませんが、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--
年月のみの設定はできません。これらのモードのみが 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)