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

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

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

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

Q&A

解決済

1回答

600閲覧

DatePickerを使用して、西暦・月・日の表示を制御したい

kanet

総合スコア13

Swift

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

0グッド

0クリップ

投稿2018/07/16 15:03

誕生日をインプットするコードを書いているのですが、西暦と月は分かるが、日は分からない、西暦だけは分かるが月と日は分からない、というようなことに対応できるようにしたいと考えています。
西暦、月、日それぞれピッカーを3つ設けると、月・日の未入力に対応するようなことはできますが、コードが冗長になり、さらに閏年への対応などができません。このような制御をDatePickerを用いてできないでしょうか?
3つのピッカーを使ったコードは以下の通りです。
よろしくお願いします。

swift

1import UIKit 2 3class ViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate { 4 5 6 @IBOutlet weak var birthdayAdTextField: UITextField! 7 var birthdayAdPicker = UIPickerView() 8 let adArray:[Int] = ([Int])(1900...2018) 9 10 @IBOutlet weak var birthdayMoTextField: UITextField! 11 var birthdayMoPicker = UIPickerView() 12 let moArray:[Int] = ([Int])(1...12) 13 14 @IBOutlet weak var birthdayDayTextField: UITextField! 15 var birthdayDayPicker = UIPickerView() 16 let dayArray:[Int] = ([Int])(1...30) 17 let dayArray2:[Int] = ([Int])(1...31) 18 let dayArray3:[Int] = ([Int])(1...28) 19 20 21 22 23 func numberOfComponents(in pickerView: UIPickerView) -> Int { 24 return 1 25 } 26 27 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 28 if pickerView.tag == 1{ 29 return adArray.count 30 }else if pickerView.tag == 2{ 31 return moArray.count 32 }else if birthdayMoTextField.text == "4" || birthdayMoTextField.text == "6" || birthdayMoTextField.text == "9" || birthdayMoTextField.text == "11"{ 33 return dayArray.count 34 }else if birthdayMoTextField.text == "2"{ 35 return dayArray3.count 36 }else{ 37 return dayArray2.count 38 } 39 } 40 41 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 42 if pickerView.tag == 1{ 43 return String(adArray[row]) 44 }else if pickerView.tag == 2{ 45 return String(moArray[row]) 46 }else if birthdayMoTextField.text == "4" || birthdayMoTextField.text == "6" || birthdayMoTextField.text == "9" || birthdayMoTextField.text == "11"{ 47 return String(dayArray[row]) 48 }else if birthdayMoTextField.text == "2"{ 49 return String(dayArray3[row]) 50 }else{ 51 return String(dayArray2[row]) 52 } 53 } 54 55 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 56 if pickerView.tag == 1{ 57 self.birthdayAdTextField.text = String(adArray[row]) 58 }else if pickerView.tag == 2{ 59 self.birthdayMoTextField.text = String(moArray[row]) 60 }else if birthdayMoTextField.text == "4" || birthdayMoTextField.text == "6" || birthdayMoTextField.text == "9" || birthdayMoTextField.text == "11"{ 61 self.birthdayDayTextField.text = String(dayArray[row]) 62 }else if birthdayMoTextField.text == "2"{ 63 self.birthdayDayTextField.text = String(dayArray3[row]) 64 }else{ 65 self.birthdayDayTextField.text = String(dayArray2[row]) 66 } 67 } 68 69 @objc func done(){ 70 view.endEditing(true) 71 if birthdayAdTextField.text == "" { 72 birthdayMoTextField.isEnabled = false 73 birthdayDayTextField.isEnabled = false 74 }else{ 75 birthdayMoTextField.isEnabled = true 76 } 77 78 if birthdayMoTextField.text == "" { 79 birthdayDayTextField.isEnabled = false 80 }else{ 81 birthdayDayTextField.isEnabled = true 82 } 83 84// self.birthdayAdTextField.endEditing(true) 85 } 86 87 88 override func viewDidLoad() { 89 super.viewDidLoad() 90 91 // Do any additional setup after loading the view, typically from a nib. 92 93 birthdayAdTextField.isEnabled = true 94 birthdayMoTextField.isEnabled = false 95 birthdayDayTextField.isEnabled = false 96 97 98 99 let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 0, height: 35)) 100 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(ViewController.done)) 101 toolbar.setItems([doneItem], animated: true) 102 103 birthdayAdPicker.tag = 1 104 birthdayAdPicker.delegate = self 105 birthdayAdPicker.dataSource = self 106 birthdayAdPicker.showsSelectionIndicator = true 107 self.birthdayAdTextField.inputView = birthdayAdPicker 108 self.birthdayAdTextField.inputAccessoryView = toolbar 109 110 111 112 birthdayMoPicker.tag = 2 113 birthdayMoPicker.delegate = self 114 birthdayMoPicker.dataSource = self 115 birthdayMoPicker.showsSelectionIndicator = true 116 self.birthdayMoTextField.inputView = birthdayMoPicker 117 self.birthdayMoTextField.inputAccessoryView = toolbar 118 119 birthdayDayPicker.tag = 3 120 birthdayDayPicker.delegate = self 121 birthdayDayPicker.dataSource = self 122 birthdayDayPicker.showsSelectionIndicator = true 123 self.birthdayDayTextField.inputView = birthdayDayPicker 124 self.birthdayDayTextField.inputAccessoryView = toolbar 125 126 } 127 128 override func didReceiveMemoryWarning() { 129 super.didReceiveMemoryWarning() 130 // Dispose of any resources that can be recreated. 131 } 132 133 134} 135 136

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

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

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

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

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

fuzzball

2018/07/17 00:28

なぜ一つのPickerViewにしないのでしょうか?
guest

回答1

0

ベストアンサー

デフォルトで月及び日に’1’を仮設定して処理では?最低限西暦は分かる仕様なので。そして月が判明した時に入力値を月の値に代入。日も同様な処理する。

投稿2018/07/16 15:12

MasahikoHirata

総合スコア3747

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

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

kanet

2018/07/30 10:24

しばらくログインしておらずお礼が遅くなりました。 デフォルトを1も解決方法だとは思うのですが、 月と日に「不明」という値を追加するのは難しいので消化?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問