teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

サンプルコードの追加

2021/09/02 09:06

投稿

shiokara
shiokara

スコア95

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