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

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

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

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

2599閲覧

同一viewcontroller内に複数の種類のpickerViewが出るようにしたい。

natsusoranosita

総合スコア18

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2017/02/21 05:10

###前提・実現したいこと
xcode8,swift3で、プログラミングを始めてまだ数ヶ月の初心者です。理解力の乏しい点などご迷惑をおかけしてしまうかと思いますが、宜しくお願いします。
同一viewcontroller内のtextfieldを押した際にそれぞれに対応するpicker viewを表示するようにしたいです。

###発生している問題・エラーメッセージ
1つのみの実装はできたのですが、他のtextfield用のを作ろうとしても、同じリストが出てしまったり、二つ目のテキストフィールドを触ったのに一つ目の値が変わってしまったりなどなかなかうまくいきません。
下記は、一つだけ実装できたコードです。

import UIKit class FirstViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { @IBOutlet weak var benderPicker: UITextField! @IBOutlet weak var haniTextField: UITextField! @IBOutlet weak var kiboTextField: UITextField! let pickerView = UIPickerView() var array = ["大企業", "中堅", "ベンチャー"] override func viewDidLoad() { super.viewDidLoad() pickerView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: pickerView.bounds.size.height) pickerView.delegate = self pickerView.dataSource = self let vi = UIView(frame: pickerView.bounds) vi.backgroundColor = UIColor.white vi.addSubview(pickerView) benderPicker.inputView = vi //ダウンとキャンセルのツールバー let toolBar = UIToolbar() toolBar.barStyle = UIBarStyle.default toolBar.isTranslucent = true toolBar.tintColor = UIColor.black let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(FirstViewController.donePressed)) let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: #selector(FirstViewController.cancelPressed)) let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil) toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) toolBar.isUserInteractionEnabled = true toolBar.sizeToFit() benderPicker.inputAccessoryView = toolBar } // Done func donePressed() { view.endEditing(true) } // Cancel func cancelPressed() { benderPicker.text = “” view.endEditing(true) } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return array[row] } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return array.count } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { benderPicker.text = array[row] } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

簡単なサンプルを作成してみました、やりたいことはできると思うのでダンロードして試してみてください。
※ 分からない処理がありましたコメントで聞いてください。

カスタムキーボードサンプル

投稿2017/02/22 00:27

編集2017/02/22 00:28
_Kentarou

総合スコア8490

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

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

natsusoranosita

2017/02/22 01:19

至らない質問にもかかわらず、丁寧に対応していただきありがとうございます!
natsusoranosita

2017/03/03 14:30

お久しぶりです、すみません今更の質問となってしまうのですが現在全てのテキストフィールドにピッカーが適用されてしまっているのですが、範囲の指定はどのコードで行なっているのでしょうか? また、例えばtextfield1のみ通常の入力にする場合どのように変更すればいいですか?よろしくおねがいいたします。
_Kentarou

2017/03/04 05:53

サンプルをそのように変更しました試してみてください。 簡単にやるには、普通にUITextFieldをStoryboardに追加すると通常のTextFieldとして使用できますよ。
guest

0

現在編集中のテキストフィールドをtextFieldDidBeginEditingメソッドで認識して、
編集中のテキストフィールドを判断してピッカーに表示するデータを切り替えればできると思います。

(参考サンプル)

class FirstViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate { @IBOutlet weak var benderPicker: UITextField! @IBOutlet weak var haniTextField: UITextField! @IBOutlet weak var kiboTextField: UITextField! let pickerView = UIPickerView() var editingTextField: UITextField! var benderArray = ["大企業", "中堅", "ベンチャー"] var haniArray = ["範囲1", "範囲2", "範囲3", "範囲4", "範囲5"] var kiboArray = ["大規模", "中規模", "小規模"] override func viewDidLoad() { super.viewDidLoad() pickerView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: pickerView.bounds.size.height) pickerView.delegate = self pickerView.dataSource = self let vi = UIView(frame: pickerView.bounds) vi.backgroundColor = UIColor.white vi.addSubview(pickerView) //ダウンとキャンセルのツールバー let toolBar = UIToolbar() toolBar.barStyle = UIBarStyle.default toolBar.isTranslucent = true toolBar.tintColor = UIColor.black let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(FirstViewController.donePressed)) let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: #selector(FirstViewController.cancelPressed)) let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil) toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) toolBar.isUserInteractionEnabled = true toolBar.sizeToFit() benderPicker.delegate = self haniTextField.delegate = self kiboTextField.delegate = self benderPicker.inputView = vi haniTextField.inputView = vi kiboTextField.inputView = vi benderPicker.inputAccessoryView = toolBar haniTextField.inputAccessoryView = toolBar kiboTextField.inputAccessoryView = toolBar } func textFieldDidBeginEditing(_ textField: UITextField) { editingTextField = textField pickerView.reloadAllComponents() } // Done func donePressed() { view.endEditing(true) } // Cancel func cancelPressed() { editingTextField.text = "" view.endEditing(true) } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { if editingTextField == benderPicker { return benderArray[row] } else if editingTextField == haniTextField { return haniArray[row] } else if editingTextField == kiboTextField { return kiboArray[row] } else { return nil } } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if editingTextField == benderPicker { return benderArray.count } else if editingTextField == haniTextField { return haniArray.count } else if editingTextField == kiboTextField { return kiboArray.count } else { return 0 } } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if editingTextField == benderPicker { benderPicker.text = benderArray[row] } else if editingTextField == haniTextField { haniTextField.text = haniArray[row] } else if editingTextField == kiboTextField { kiboTextField.text = kiboArray[row] } } }

うまくいかない時は、うまくいかない状態のコードを載せた方が回答がつきやすいと思います。
それならうまくいかないところを指摘したらいいだけですから。

うまくいかないところを全部消してどうしたらいいかと聞いたら、
何も試さずに丸投げで聞いているように見られますよ。

投稿2017/02/21 23:33

TakeOne

総合スコア6299

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

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

natsusoranosita

2017/02/22 01:22

ありがとうございました、以降気をつけるようにいたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問