質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2517閲覧

【xcode/swift】DatePickerの表示内容をどうにかしたい

退会済みユーザー

退会済みユーザー

総合スコア0

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/08/27 02:42

こんにちは。

初質問になりますので、不手際あればご容赦ください。

前提・実現したいこと

DatePickerで

Preferred Style : Wheels
Mode : Date and Time
Locale : Japanese

の時、年(西暦)も表示したいのですが、設定で可能なのでしょうか?
それとも、override(?)などして、カスタマイズするものなのでしょうか?

発生している問題・エラーメッセージ

ModeをDateにした時は、年も表示されているのですが、
Date and Timeにすると、年の表示がなくなります。

・Mode = Date時の表示

2021年 8月 27日

・Mode = Date and Time時の表示

8月27日 金 11 17 → 年の表示が無いので、選択できない → 曜日は要らないのに・・・・ ​

該当のソースコード

Storyboard上のため無し。

試したこと

DatePickerを二つ横に並べて、Modeを左はDate、右はTime、
とやれば実現可能かと思いますが、ちょっとそれは違う・・・と思っています。

補足情報(FW/ツールのバージョンなど)

XCode : 12.5.1
Target : iOS 14.1以上

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Preferred Style : Compact
Mode : Date and Time
このように設定すれば日付と時間、年全て入力できますが。
どうしてもwheelsで実装したいと言うことでしょうか?その場合は標準では用意されていないみたいなので自分で作成する必要がありそうです。

[追記]
自分が以前実装した時のコードです。このまま使えないとは思いますが参考までに・・・。

Swift

1import UIKit 2 3 4class ViewController: UIViewController { 5 // textFieldなのかわかりませんが必要であれば変えてください 6 // それとoutletを繋げてください 7 @IBOutlet weak var textField: UITextField! 8 var picker: UIPickerView! 9 10 var toolbar: UIToolbar = { 11 let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 0, height: 35)) 12 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(done)) 13 toolbar.setItems([doneItem], animated: true) 14 15 return toolbar 16 }() 17 18 private let yearList: [Int] = Array(2000...2100) 19 private let monthList: [Int] = Array(1...12) 20 private let dayList: [Int] = Array(1...31) 21 private let hourList: [Int] = Array(0...23) 22 private let minuteList: [Int] = Array(0...59) 23 24 var dateFormatter: DateFormatter = { 25 let f = DateFormatter() 26 // 表示用に使うフォーマット 27 // 必要であれば変えてください 28 f.dateFormat = "yyyy/MM/dd hh:mm" 29 return f 30 }() 31 32 override func viewDidLoad() { 33 super.viewDidLoad() 34 picker = UIPickerView() 35 picker.delegate = self 36 picker.dataSource = self 37 38 39 textField.inputView = picker 40 textField.inputAccessoryView = toolbar 41 setTodayValue() 42 } 43 44 @objc func done() { 45 textField.endEditing(true) 46 updateTextField() 47 } 48 49 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 50 super.touchesBegan(touches, with: event) 51 textField.endEditing(true) 52 updateTextField() 53 } 54 55 func setTodayValue() { 56 let date = Date() 57 58 let f0 = DateFormatter() 59 f0.dateFormat = "yyyy" 60 if let int = Int(f0.string(from: date)), let row = yearList.firstIndex(of: int) { 61 picker.selectRow(row, inComponent: 0, animated: false) 62 } 63 64 let f1 = DateFormatter() 65 f1.dateFormat = "M" 66 if let int = Int(f1.string(from: date)), let row = monthList.firstIndex(of: int) { 67 picker.selectRow(row, inComponent: 1, animated: false) 68 } 69 70 let f2 = DateFormatter() 71 f2.dateFormat = "d" 72 if let int = Int(f2.string(from: date)), let row = dayList.firstIndex(of: int) { 73 picker.selectRow(row, inComponent: 2, animated: false) 74 } 75 76 let f3 = DateFormatter() 77 f3.dateFormat = "H" 78 if let int = Int(f3.string(from: date)), let row = hourList.firstIndex(of: int) { 79 picker.selectRow(row, inComponent: 3, animated: false) 80 } 81 82 let f4 = DateFormatter() 83 f4.dateFormat = "m" 84 if let int = Int(f4.string(from: date)), let row = minuteList.firstIndex(of: int) { 85 picker.selectRow(row, inComponent: 4, animated: false) 86 } 87 updateTextField() 88 } 89 90 func updateTextField() { 91 if let date = fetchDateFromPicker() { 92 textField.text = dateFormatter.string(from: date) 93 } 94 } 95 96 func fetchDateFromPicker() -> Date? { 97 let selectedYear = yearList[picker.selectedRow(inComponent: 0)] 98 let selectedMonth = String(monthList[picker.selectedRow(inComponent: 1)]) 99 let selectedDay = String(dayList[picker.selectedRow(inComponent: 2)]) 100 let selectedHour = String(hourList[picker.selectedRow(inComponent: 3)]) 101 let selectedMinute = String(minuteList[picker.selectedRow(inComponent: 4)]) 102 103 let string = "(selectedYear)/(selectedMonth)/(selectedDay) (selectedHour):(selectedMinute)" 104 let f = DateFormatter() 105 f.dateFormat = "yyyy/M/d H:m" 106 107 return f.date(from: string) 108 } 109} 110 111extension ViewController: UIPickerViewDelegate, UIPickerViewDataSource { 112 113 func numberOfComponents(in pickerView: UIPickerView) -> Int { 114 return 5 115 } 116 117 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 118 switch component { 119 case 0: 120 return yearList.count 121 case 1: 122 return monthList.count 123 case 2: 124 return dayList.count 125 case 3: 126 return hourList.count 127 case 4 : 128 return minuteList.count 129 default: 130 return 0 131 } 132 } 133 134 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 135 switch component { 136 case 0: 137 return String(yearList[row]) 138 case 1: 139 return String(format: "%02d", monthList[row]) 140 case 2: 141 return String(format: "%02d", dayList[row]) 142 case 3: 143 return String(format: "%02d", hourList[row]) 144 case 4 : 145 return String(format: "%02d", minuteList[row]) 146 default: 147 return nil 148 } 149 } 150 151 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 152 updateTextField() 153 } 154 155 func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat { 156 switch component { 157 case 0: 158 return 100 159 case 1: 160 return 40 161 case 2: 162 return 40 163 case 3: 164 return 40 165 case 4 : 166 return 40 167 default: 168 return 0 169 } 170 } 171} 172

投稿2021/09/02 08:31

編集2021/09/02 09:06
shiokara

総合スコア95

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/09/02 08:47

@shiokaraさん ご回答ありがとうございました。 やっぱりそうですか。見栄えと操作感が好きでないのですが、諦めてCompact使います
shiokara

2021/09/02 09:06

以前自分が実装したコードが残っていたので追記させていただきました。 参考になればと思います。
退会済みユーザー

退会済みユーザー

2021/09/06 02:20

shiokaraさん コード提示ありがとうございます。 textFieldの入力としてpickerを使い、pickerの表示内容はextentionでカスタマイズしている というとこでしょうか。勉強になります。 24時間表記や表示方法等、少しカスタマイズすればやれそうなので、 参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問