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

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

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

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

Swift 2

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

Q&A

解決済

1回答

7534閲覧

UITextFieldの選択状態を検知する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

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

Swift 2

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

0グッド

2クリップ

投稿2016/05/09 13:27

UITextFieldを複数個storyboard上に配置させ、それぞれでピッカーを表示させようと考えています。

そこで、ピッカーを表示させる際に、このテキストフィールドをタップした時にはこのピッカーを表示させ、他のテキストフィールドをタップした時には他のピッカーを表示させる。というようにしたいのですが、どのようにしてそれぞれのテキストフィールドをタップしたことを検知すれば良いのかご教授お願いします。

現状以下のようなどちらを選択しても同じピッカーが現れるようになっています。
イメージ説明

以下、コードを乗せておきます。

swift

1 2class MyPageViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource,UIToolbarDelegate{ 3 4 var myToolBar:UIToolbar! 5 6 let sexList = ["ーーーーー","男","女"] 7 let addressList = ["ーーーーー","北海道","青森"] 8 9 @IBOutlet weak var sexText: UITextField! 10 @IBOutlet weak var addressText: UITextField! 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 let myPicker = UIPickerView() 16 17 myPicker.delegate = self 18 myPicker.dataSource = self 19 20 sexText.inputView = myPicker 21 addressText.inputView = myPicker 22 23 myToolBar = UIToolbar(frame: CGRectMake(0, self.view.frame.size.height/6, self.view.frame.size.width, 40.0)) 24 myToolBar.layer.position = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height-20.0) 25 myToolBar.barStyle = .Default 26 27 let toolBarBtn = UIBarButtonItem(title: "完了", style: .Plain, target: self, action: "myOK:") 28 toolBarBtn.tag = 1 29 myToolBar.items = [toolBarBtn] 30 31 sexText.inputAccessoryView = myToolBar 32 addressText.inputAccessoryView = myToolBar 33 } 34 35 override func didReceiveMemoryWarning() { 36 super.didReceiveMemoryWarning() 37 } 38 39 func myOK(sender: UIBarButtonItem) { 40 sexText.resignFirstResponder() 41 addressText.resignFirstResponder() 42 } 43 44 func numberOfComponentsInPickerView(picker:UIPickerView)->Int{ 45 return 1 46 } 47 48 func pickerView(picker:UIPickerView,numberOfRowsInComponent component:Int)->Int{ 49 50 return sexList.count 51 } 52 53 func pickerView(picker:UIPickerView,titleForRow row:Int,forComponent component:Int)->String?{ 54 return sexList[row] 55 } 56 57} 58

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

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

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

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

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

guest

回答1

0

ベストアンサー

簡単に分けるとすると、以下のようになると思います。

swift

1import UIKit 2 3// ↓ 追加(UITextFieldDelegate ※Storyboardで設定しても可) 4class MyPageViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource,UIToolbarDelegate, UITextFieldDelegate { 5 6 var myToolBar:UIToolbar! 7 8 let sexList = ["ーーーーー","男","女"] 9 let addressList = ["ーーーーー","北海道","青森"] 10 11 // ↓ 追加 12 var dataList: [String] = [] 13 14 let myPicker = UIPickerView() 15 16 @IBOutlet weak var sexText: UITextField! 17 @IBOutlet weak var addressText: UITextField! 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 22 // ↓ 追加 23 sexText.delegate = self 24 addressText.delegate = self 25 sexText.tag = 1 26 addressText.tag = 2 27 28 29 myPicker.delegate = self 30 myPicker.dataSource = self 31 32 sexText.inputView = myPicker 33 addressText.inputView = myPicker 34 35 myToolBar = UIToolbar(frame: CGRectMake(0, self.view.frame.size.height/6, self.view.frame.size.width, 40.0)) 36 myToolBar.layer.position = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height-20.0) 37 myToolBar.barStyle = .Default 38 39 let toolBarBtn = UIBarButtonItem(title: "完了", style: .Plain, target: self, action: "myOK:") 40 toolBarBtn.tag = 1 41 myToolBar.items = [toolBarBtn] 42 43 sexText.inputAccessoryView = myToolBar 44 addressText.inputAccessoryView = myToolBar 45 } 46 47 // ↓ 追加 48 func textFieldShouldBeginEditing(textField: UITextField) -> Bool { 49 dataList = textField.tag == 1 ? sexList : addressList 50 myPicker.reloadAllComponents() 51 return true 52 } 53 54 override func didReceiveMemoryWarning() { 55 super.didReceiveMemoryWarning() 56 } 57 58 func myOK(sender: UIBarButtonItem) { 59 sexText.resignFirstResponder() 60 addressText.resignFirstResponder() 61 } 62 63 func numberOfComponentsInPickerView(picker:UIPickerView)->Int{ 64 return 1 65 } 66 67 func pickerView(picker:UIPickerView,numberOfRowsInComponent component:Int)->Int{ 68 // ↓ 変更 69 return dataList.count 70 } 71 72 func pickerView(picker:UIPickerView,titleForRow row:Int,forComponent component:Int)->String?{ 73 // ↓ 変更 74 return dataList[row] 75 } 76}

投稿2016/05/09 13:55

編集2016/05/09 14:46
_Kentarou

総合スコア8490

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

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

退会済みユーザー

退会済みユーザー

2016/05/09 14:24

ご回答ありがとうございます。 Kenterou様のいう通りコードを変更してみましたところ、少し挙動はおかしいですが、初めてタップした時点ではそれぞれのピッカーを表示することができました。 ありがとうございます。 もう一つお聞きしたいのですが、textFieldShouldBeginEditing関数で dataList = textField.tag == 1 ? sexList : addressList と表記されていますが、勉強不足のため全く理解出来ませんでした。 何をしているのか少し教えて頂けませんか?
_Kentarou

2016/05/09 14:38 編集

dataListは表示する配列で、そこにsexListかaddressListのどちらかを入れるという処理です。 ※三項演算子という書き方になります。 テキストフィールドにフォーカスが入った時にDelegateメソッドが呼ばれ、この時の引数にフォーカスの入ったtextFieldが渡ってくるのでそのtextfieldのタグが1(true)だったら(sexText)なのでdataListにsexListをセットしているという事です。
退会済みユーザー

退会済みユーザー

2016/05/09 14:44

ありがとうございました。 勉強します。
_Kentarou

2016/05/09 14:47

完了を押さず、ピッカーを切り替えた時に配列ごと切り替える様に回答を変更しました。 試してみてください。
退会済みユーザー

退会済みユーザー

2016/05/10 13:27

ご丁寧にありがとうございます! このコードは保存しておきます。 本当に感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問