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

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

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

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

Swift

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

Q&A

解決済

2回答

2579閲覧

PickerViewの使い方

tonosam

総合スコア14

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/08/23 04:38

PickerViewを用いた実装をしたいのですが、
想定通りに動かず困っております。

下記コードでpickerViewを2つ表示することができたのですが、
ドラムロールの中身が両方一緒になってしまいます。
しかし、実際に選択してみるとtextLabelには互いに違う選択内容が反映されております。
どこを訂正すれば良いのでしょうか。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var textField: UITextField! 6 @IBOutlet weak var textField2: UITextField! 7 8 var pickerView: UIPickerView = UIPickerView() 9 var pickerView2: UIPickerView = UIPickerView() 10 11 12 let list: [String] = ["メインクーン", "シャム", "ロシアンブルー", "アメリカンショートヘア", "ネベロング", "ビクシーボブ", "ラガマフィン", "ラパーマ"] 13 let tono: [String] = ["tomtooof", "シャム", "dvecs v", "アedfvdvcvdvdev", "ネevdfvdsvグ", "ビクdvsdvsdv", "ラガマdvdsン", "ラパーsdvs sd!"] 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 // ピッカー設定 19 pickerView.delegate = self 20 pickerView.dataSource = self 21 pickerView.showsSelectionIndicator = true 22 23 pickerView2.delegate = self 24 pickerView2.dataSource = self 25 pickerView2.showsSelectionIndicator = true 26 // 決定バーの生成 27 let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35)) 28 let spacelItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 29 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(done)) 30 toolbar.setItems([spacelItem, doneItem], animated: true) 31 // インプットビュー設定 32 textField.inputView = pickerView 33 textField.inputAccessoryView = toolbar 34 35 textField2.inputView = pickerView2 36 textField2.inputAccessoryView = toolbar 37 } 38 // 決定ボタン押下 39 @objc func done() { 40 textField.endEditing(true) 41 textField.text = "(list[pickerView.selectedRow(inComponent: 0)])" 42 43 textField2.endEditing(true) 44 textField2.text = "(tono[pickerView2.selectedRow(inComponent: 0)])" 45 } 46} 47 48extension ViewController : UIPickerViewDelegate, UIPickerViewDataSource { 49 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 list.count 58 } 59 60 // ドラムロールの各タイトル 61 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 62 return list[row] 63 } 64} 65

build後のstoryboard

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

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

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

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

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

guest

回答2

0

そもそもpickerviewが2つも必要でしょうか?
同時に2個表示する(できるのかな???)つもりがないなら、
2個もいらないのではないでしょうか?

通常は1個用意し、
選んだtextFieldにより表示内容を切り替えるのが普通の使い方だと思いますよ。
textFieldにtagをつけて、選択されたtextFieldのtagによって、
読み込むリストを切り替えるようにコードを書けば解決すると思います。

thyda.eiquaさんが投稿しているようにtagをtextFieldにつけて
pickerView.tagではなく、textField.tagで条件分岐をしてくださいね。
あと、textField didselectにpickerView.reloadInputViews()を忘れないように。

投稿2019/08/23 05:18

編集2019/08/23 05:22
hameji

総合スコア1380

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

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

tonosam

2019/08/23 05:24

なるほど参考になります! 詳細説明感謝いたします!!!!
thyda.eiqau

2019/08/23 06:14

ああ、そうですね、確かに……何も考えずに言われてみたままのコードを提示していました。追記修正しておきます。
tonosam

2019/08/23 06:15

お願いいたします!!!
guest

0

ベストアンサー

swift

1// ピッカー設定 2pickerView.delegate = self 3pickerView.dataSource = self 4pickerView.showsSelectionIndicator = true 5pickerView.tag = 1; 6 7pickerView2.delegate = self 8pickerView2.dataSource = self 9pickerView2.showsSelectionIndicator = true 10pickerView2.tag = 2;

swift

1// ドラムロールの行数 2func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 3 switch(pickerView.tag) { 4 case 1: return list.count; 5 case 2: return tono.count; 6 default: return 0; 7 } 8} 9 10// ドラムロールの各タイトル 11func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 12 switch(pickerView.tag) { 13 case 1: return list[row]; 14 case 2: return tono[row]; 15 default: return nil; 16 } 17}

追記修正

hamejiさんの回答をうけて修正します。上記のコードでも動きますが、現実的にpickerViewが2つ必要になるシーンは無いと思いますので……
また、同様の質問が過去にあったようです。あわせてご確認ください。

swift

1import UIKit 2 3class ViewController: UIViewController, UITextFieldDelegate, UIPickerViewDelegate, UIPickerViewDataSource { 4 // MARK: - Properies Define 5 @IBOutlet weak var textField: UITextField! 6 @IBOutlet weak var textField2: UITextField! 7 var pickerView: UIPickerView = UIPickerView() 8 let list: [String] = ["メインクーン", "シャム", "ロシアンブルー", "アメリカンショートヘア", "ネベロング", "ビクシーボブ", "ラガマフィン", "ラパーマ"] 9 let tono: [String] = ["tomtooof", "シャム", "dvecs v", "アedfvdvcvdvdev", "ネevdfvdsvグ", "ビクdvsdvsdv", "ラガマdvdsン", "ラパーsdvs sd!"] 10 11 // いま編集しようとしている textField の tag 12 var inEditingTextFieldTag: Int = 0; 13 14 // MARK: - View Lyfecycle 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 // ピッカー設定 19 pickerView.delegate = self 20 pickerView.dataSource = self 21 pickerView.showsSelectionIndicator = true 22 23 // 決定バーの生成 24 let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35)) 25 let spacelItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 26 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(done)) 27 toolbar.setItems([spacelItem, doneItem], animated: true) 28 29 // インプットビュー設定 30 textField.inputView = pickerView 31 textField.inputAccessoryView = toolbar 32 textField.tag = 1 33 textField.delegate = self 34 textField2.inputView = pickerView 35 textField2.inputAccessoryView = toolbar 36 textField2.tag = 2 37 textField2.delegate = self 38 } 39 40 // !!!: 中略 41 42 // MARK: - UITextFieldDelegate 43 /// いま編集しようとしている textField の tag を Property に保持しておく 44 func textFieldDidBeginEditing(_ textField: UITextField) { 45 inEditingTextFieldTag = textField.tag 46 pickerView.reloadInputViews() 47 } 48 49 // MARK: - UIPickerViewDataSource 50 // ドラムロールの列数 51 func numberOfComponents(in pickerView: UIPickerView) -> Int { 52 return 1 53 } 54 55 // ドラムロールの行数 56 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 57 // 将来的に textField の数が増えたらcase文を増やしていく 58 switch(inEditingTextFieldTag) { 59 case 0: return list.count; 60 case 1: return tono.count; 61 default: return 0; 62 } 63 } 64 65 // MARK: - UIPickerViewDataSource 66 // ドラムロールの各タイトル 67 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 68 // 将来的に textField の数が増えたらcase文を増やしていく 69 switch(inEditingTextFieldTag) { 70 case 0: return list[row]; 71 case 1: return tono[row]; 72 default: return nil; 73 } 74 } 75}

投稿2019/08/23 05:11

編集2019/08/23 06:47
thyda.eiqau

総合スコア2982

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

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

tonosam

2019/08/23 05:23

解決いたしました!!! 本当にありがとうございます!
hameji

2019/08/23 05:25

上記でもできますが、正確には無駄なpickerView生成をしており誤りだと思います。
tonosam

2019/08/23 06:15

今後の実装内容としましては、同じようなpickerViewを5つ配置する予定なので、よろしければ無駄なPickerViewに関して教えていただければ幸いです。、、
tonosam

2019/08/23 06:40

なるほど。。。 ここまでかなり明確に書いて頂き、これ以上にくらい嬉しいです。。 本当にありがとうございました!!!!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問