完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
S7r1n9y
Engineer
このシリーズの記事一覧
- 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
- 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
- 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
- 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
- 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
- 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
- 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
- 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
- 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
- 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
- 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
- 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
- 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
- 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
- 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
- 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
- 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
- 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
- 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
- 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
- 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
- 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
- 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
- 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
- 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
- 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
- 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
- 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
- 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
- 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる
Sponsored
完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
ユーザーに「生年月日」や「都道府県」を入力してもらう際、普通の文字入力(UITextField)を使うと形式の揺れ(例: "2023/1/1" と "2023年01月01日")が発生し、エラー処理が非常に面倒になります。
iOSには、これらを直感的に、かつフォーマットを統一して入力させるための2つの優れたピッカー・コンポーネントが用意されています。
1. UIDatePicker (日付と時間の入力)
UIDatePicker は、日付や時間を入力するための専用コンポーネントです。iOS 14でデザインが大きく刷新されました。
Storyboardでの設定 (Attributes Inspector)
- Style: 表示スタイル。iOS 14以降の選択肢は以下の通りです。
- Compact: デフォルト。小さなボタンとして表示され、タップするとカレンダーがポップアップします。レイアウトを崩さず省スペースで済むため推奨されます。
- Inline: 常にカレンダー全体が画面に展開された状態で表示されます。
- Wheels: 昔ながらのドラムロール(スロットマシン)形式です。
- Mode: 選択させる内容。
- Date (年月日), Time (時刻), Date and Time (両方), Count Down Timer (タイマー用) の4種類。
- Locale: 「日本語」を指定すると、年月日の順序などが日本向けになります。
コードで値を取得する
値が変更された時のイベントは、Buttonのクリックと同様に IBAction (Event: Value Changed) で受け取ります。
swift@IBOutlet weak var dateLabel: UILabel! // Value Changed イベントで接続 @IBAction func datePickerValueChanged(_ sender: UIDatePicker) { // sender.date で Dateオブジェクト(現在選ばれている日時)が取得できる let selectedDate: Date = sender.date // DateFormatterを作って文字列(String)に変換するのが定石 let formatter = DateFormatter() formatter.dateFormat = "yyyy年MM月dd日 HH:mm" dateLabel.text = formatter.string(from: selectedDate) }
2. UIPickerView (任意の選択肢入力)
「都道府県」や「血液型」など、任意の配列データから一つを選ばせたい場合は UIPickerView(ドラムロール形式のUI)を使います。
こちらは UITableView(Day 15参照) と仕組みが非常によく似ており、DataSource と Delegate プロトコル を使ってセルの数や文字を提供します。
実装ステップ
- Storyboardに
Picker Viewを配置し、IBOutlet で接続します。
swiftclass ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { @IBOutlet weak var myPickerView: UIPickerView! let bloodTypes = ["A型", "B型", "O型", "AB型"] override func viewDidLoad() { super.viewDidLoad() // 担当者(自分)を登録 myPickerView.dataSource = self myPickerView.delegate = self } // --- DataSource --- // ① 列(コンポーネント)の数。通常は1列なので `1` を返す func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } // ② 行の数。配列の要素数を返す func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return bloodTypes.count } // --- Delegate --- // ③ 各行に表示する文字列(String)を返す func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return bloodTypes[row] } // ④ ドラムロールが止まり、値が選択された時の処理 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { let selectedValue = bloodTypes[row] print("選択されたのは: \(selectedValue)") } }
💡 応用: 選択肢をキーボードの代わりに出す(超実践的)
設定画面などでは、Pickerを画面に常に表示しておくのではなく、「UITextFieldをタップすると、文字キーボードの代わりにPickerが下から現れる」というUXが一般的です。
なんと、わずか数行で実装可能です。
swift// viewDidLoad内 let customPicker = UIPickerView() customPicker.dataSource = self customPicker.delegate = self // 魔法の1行:TextFieldの入力View(キーボード)をPickerに差し替える! myTextField.inputView = customPicker
📝 今日のまとめ
- UIDatePicker: 日付・時刻選択用。iOS 14以降の
Compactスタイルを使うのがモダン。DateFormatterを使ってStringに変換する。 - UIPickerView: 配列から任意の値を選択させるドラムロール。実装には
DataSourceとDelegateが必要。 - TextFieldの
inputViewプロパティにPickerを代入すると、キーボードの代わりにPickerを下から表示させることができる。
iOS特有の美しい入力インターフェースの使い分けができるようになりました。 明日の Day 24 からは第6部「中〜上級テクニックとモダンな開発」に入り、複数人開発(Git管理)においてStoryboard最大の弱点となる「競合(コンフリクト)」を回避するための強力な設計手法、Storyboard Reference を用いた分割術を学びます。
このシリーズの記事一覧
- 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
- 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
- 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
- 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
- 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
- 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
- 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
- 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
- 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
- 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
- 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
- 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
- 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
- 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
- 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
- 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
- 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
- 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
- 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
- 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
- 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
- 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
- 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
- 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
- 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
- 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
- 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
- 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
- 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
- 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる