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

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

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

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

Swift

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

Q&A

解決済

3回答

1071閲覧

PickerViewをTextFieldから表示するときの条件分岐について

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/01/28 07:08

編集2019/01/28 07:45

現在誕生日のカウントダウン+通知アプリを作っています。

今実装している機能は、通知する日にちと時間を入力する機能です。
そこで、通知する日時を入力する欄をTextFieldとPickerViewを使って作りました。(こちらの記事を参考にしました)
しかし、日にちを入力するTextFieldと時間を入力するTextFieldとそれぞれ二つあり、それぞれのTextFieldをタップするとPickerVIewが出てきて数字が選択できる仕様にしたいと思っています。

色々試したのですが、TextField1とTextField2で条件分岐させてそれぞれ違うPickerViewを表示させるにはどうすればよいでしょうか。ちなみに、TextField1にはlist1を、TextField2にはlist2を要素としてもったPickerViewを表示したいです。

下に載せたコードはどちらのTextFieldを入力してもlist1のPickerViewが出てきて、textField1に入力される用になっています。

今までに試した方法はtagで条件分岐させる方法だったのですがうまく場合分けしてくれません。。。

環境はxcode Version 10.1, Swift4です。

よろしくお願いします。

swift

1import UIKit 2 3class ContainerViewController: UITableViewController, UIPickerViewDelegate, UIPickerViewDataSource { 4 5 @IBOutlet weak var textField1: UITextField! 6 @IBOutlet weak var textField2: UITextField! 7 8 let appDelegate = UIApplication.shared.delegate as! AppDelegate 9 10 var pickerView: UIPickerView = UIPickerView() 11 let list1 = ["", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"] 12 let list2 = ["","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23"] 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 17 pickerView.delegate = self 18 pickerView.dataSource = self 19 pickerView.showsSelectionIndicator = true 20 21 let toolbar = UIToolbar(frame: CGRectMake(0, 0, 0, 35)) 22 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(ContainerViewController.done)) 23 let cancelItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(ContainerViewController.cancel)) 24 toolbar.setItems([cancelItem, doneItem], animated: true) 25 26 self.textField1.inputView = pickerView 27 self.textField1.inputAccessoryView = toolbar 28 self.textField2.inputView = pickerView 29 self.textField2.inputAccessoryView = toolbar 30 31 tableView.isScrollEnabled = false 32 33 } 34 35 // MARK: - Table view data source 36 37 38 override func numberOfSections(in tableView: UITableView) -> Int { 39 // #warning Incomplete implementation, return the number of sections 40 return 1 41 } 42 43 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 44 45 46 return 3 47 } 48 49 //PickerView設定 50 51 func numberOfComponents(in pickerView: UIPickerView) -> Int { 52 return 1 53 } 54 55 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 56 57 return list1.count 58 59 } 60 61 62 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 63 64 return list1[row] 65 66 } 67 68 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 69 70 self.textField1.text = list1[row] 71 72 } 73 74 @objc func cancel() { 75 self.textField1.text = "" 76 self.textField1.endEditing(true) 77 } 78 79 @objc func done() { 80 81 appDelegate.number1 = Int(textField1.text!) 82 self.textField1.endEditing(true) 83 84 } 85 86 func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect { 87 return CGRect(x: x, y: y, width: width, height: height) 88 } 89 90 override func didReceiveMemoryWarning() { 91 super.didReceiveMemoryWarning() 92 // Dispose of any resources that can be recreated. 93 } 94

<追記>
今までに試したtagで条件分岐させる方法
storyboard上でtextField1にtag1, textField2にtag2を入力。

swift

1import UIKit 2 3class ContainerViewController: UITableViewController, UIPickerViewDelegate, UIPickerViewDataSource { 4 5 @IBOutlet weak var notificationTextField: UITextField! 6 7 let appDelegate = UIApplication.shared.delegate as! AppDelegate 8 9 var pickerView: UIPickerView = UIPickerView() 10 let list1 = ["", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"] 11 let list2 = ["","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23"] 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 pickerView.delegate = self 17 pickerView.dataSource = self 18 pickerView.showsSelectionIndicator = true 19 20 let toolbar = UIToolbar(frame: CGRectMake(0, 0, 0, 35)) 21 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(ContainerViewController.done)) 22 let cancelItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(ContainerViewController.cancel)) 23 toolbar.setItems([cancelItem, doneItem], animated: true) 24 25 self.notificationTextField.inputView = pickerView 26 self.notificationTextField.inputAccessoryView = toolbar 27 28 tableView.isScrollEnabled = false 29 30 } 31 32 // MARK: - Table view data source 33 34 35 override func numberOfSections(in tableView: UITableView) -> Int { 36 // #warning Incomplete implementation, return the number of sections 37 return 1 38 } 39 40 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 41 42 return 3 43 } 44 45 //PickerView設定 46 47 func numberOfComponents(in pickerView: UIPickerView) -> Int { 48 49 return 1 50 51 } 52 53 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 54 55 if view.tag == 1{ 56 return list1.count 57 }else{ 58 return list2.count 59 } 60 61 } 62 63 64 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 65 66 if view.tag == 1{ 67 return list1[row] 68 }else{ 69 return list2[row] 70 } 71 72 } 73 74 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 75 76 if view.tag == 1{ 77 self.notificationTextField.text = list1[row] 78 }else{ 79 self.notificationTextField.text = list2[row] 80 } 81 82 } 83 84 @objc func cancel() { 85 if view.tag == 1{ 86 self.notificationTextField.text = "" 87 self.notificationTextField.endEditing(true) 88 } 89 } 90 91 @objc func done() { 92 if view.tag == 1{ 93 appDelegate.number1 = Int(notificationTextField.text!) 94 self.notificationTextField.endEditing(true) 95 }else{ 96 appDelegate.number2 = Int(notificationTextField.text!) 97 self.notificationTextField.endEditing(true) 98 } 99 100 } 101 102 func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect { 103 return CGRect(x: x, y: y, width: width, height: height) 104 } 105 106 override func didReceiveMemoryWarning() { 107 super.didReceiveMemoryWarning() 108 // Dispose of any resources that can be recreated. 109 } 110 111} 112

これでそれぞれのTextFieldをnotificationTextFieldにOutlet接続したら条件分岐するかなと思ったらIBOutletは一つずつしか接続できなくてできませんでした。

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

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

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

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

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

fuzzball

2019/01/28 07:15

>>今までに試した方法はtagで条件分岐させる方法だったのですがうまく場合分けしてくれません そのコードを書いてもらわないとアドバイスできません。
退会済みユーザー

退会済みユーザー

2019/01/28 07:47

追記しました。めちゃくちゃなコードですみません。。。
guest

回答3

0

本題とはずれてしまいますが、
好みがあるでしょうが、自分だったら、単純にDatepickerを利用します。
そのほうが、うるう年問題や、月ごとに最終日のズレがあるのを
修正するコードを自分で実装しなくて済むからです。

投稿2019/01/29 23:15

編集2019/01/29 23:15
hameji001

総合スコア639

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

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

0

以下のような方法で解決しました。

swift

1import UIKit 2 3class ContainerViewController: UITableViewController, UIPickerViewDelegate, UIPickerViewDataSource { 4 5 @IBOutlet weak var notificationDayTextField: UITextField! 6 @IBOutlet weak var notificationTimeTextField: UITextField! 7 8 let appDelegate = UIApplication.shared.delegate as! AppDelegate 9 10 var pickerView1: UIPickerView = UIPickerView() 11 let list1 = ["", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"] 12 13 var pickerView2: UIPickerView = UIPickerView() 14 let list2 = ["","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23"] 15 16 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 20 //pickerVIew1 21 pickerView1.delegate = self 22 pickerView1.dataSource = self 23 pickerView1.showsSelectionIndicator = true 24 pickerView1.tag = 1 // <<<<<<<<<< 追加 25 26 let toolbar1 = UIToolbar(frame: CGRectMake(0, 0, 0, 35)) 27 let doneItem1 = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(ContainerViewController.done)) 28 let cancelItem1 = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(ContainerViewController.cancel)) 29 toolbar1.setItems([cancelItem1, doneItem1], animated: true) 30 31 self.notificationDayTextField.inputView = pickerView1 32 self.notificationDayTextField.inputAccessoryView = toolbar1 33 34 //pickerView2 35 pickerView2.delegate = self 36 pickerView2.dataSource = self 37 pickerView2.showsSelectionIndicator = true 38 pickerView2.tag = 2 // <<<<<<<<<< 追加 39 40 41 let toolbar2 = UIToolbar(frame: CGRectMake(0, 0, 0, 35)) 42 let doneItem2 = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(ContainerViewController.done)) 43 let cancelItem2 = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(ContainerViewController.cancel)) 44 toolbar2.setItems([cancelItem2, doneItem2], animated: true) 45 46 self.notificationTimeTextField.inputView = pickerView2 47 self.notificationTimeTextField.inputAccessoryView = toolbar2 48 49 50 tableView.isScrollEnabled = false 51 52 } 53 54 // MARK: - Table view data source 55 56 57 override func numberOfSections(in tableView: UITableView) -> Int { 58 // #warning Incomplete implementation, return the number of sections 59 return 1 60 } 61 62 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 63 64 return 3 65 } 66 67 //PickerView設定 68 69 func numberOfComponents(in pickerView: UIPickerView) -> Int { 70 71 return 1 72 73 } 74 75 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 76 77 if pickerView.tag == 1{ 78 return list1.count 79 }else{ 80 return list2.count 81 } 82 83 } 84 85 86 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 87 88 if pickerView.tag == 1{ 89 return list1[row] 90 }else{ 91 return list2[row] 92 } 93 94 } 95 96 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 97 98 if pickerView.tag == 1{ 99 self.notificationDayTextField.text = list1[row] 100 }else{ 101 self.notificationTimeTextField.text = list2[row] 102 } 103 104 } 105 106 @objc func cancel() { 107 108 let pickerView = UIPickerView() 109 110 if pickerView.tag == 2{ 111 self.notificationDayTextField.text = "" 112 self.notificationDayTextField.endEditing(true) 113 }else{ 114 self.notificationTimeTextField.text = "" 115 self.notificationTimeTextField.endEditing(true) 116 } 117 118 } 119 120 @objc func done() { 121 122 let pickerView = UIPickerView() 123 124 if pickerView.tag == 1{ 125 appDelegate.number1 = Int(notificationDayTextField.text!) 126 self.notificationDayTextField.endEditing(true) 127 }else{ 128 appDelegate.number2 = Int(notificationTimeTextField.text!) 129 self.notificationTimeTextField.endEditing(true) 130 } 131 132 } 133 134 func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect { 135 return CGRect(x: x, y: y, width: width, height: height) 136 } 137 138 override func didReceiveMemoryWarning() { 139 super.didReceiveMemoryWarning() 140 // Dispose of any resources that can be recreated. 141 } 142 143}

投稿2019/01/28 08:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fuzzball

2019/01/28 08:37

同時に表示しないなら1つでいいですよ。
退会済みユーザー

退会済みユーザー

2019/01/28 08:43

textFieldをタップした時にPickerViewが出るようにしてます。 ただ、今確認したところDoneを押してもpickerViewからnotificationDayTextFieldに値が代入できておらずnilになっていました。。。
guest

0

ベストアンサー

tagはPickerViewに付けて下さい。

投稿2019/01/28 07:49

fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2019/01/28 08:33

解決しました!! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問