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

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

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

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

2971閲覧

textFieldのkeyboard表示とpickerView表示の切り替え方法

hameji001

総合スコア639

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2019/01/07 10:51

編集2019/01/08 10:33

上記を質問させてください。

今作成中のプログラムでtextField0に入力をさせる際に
まず、最初はpickerViewを用いて、
選択肢の中から選ばせようと思ってるんですが、
もしその中にない場合は、keyboardで手入力をさせたいです。
しかし、pickerViewからkeyboardへのinputViewの切り替えがうまくできません。
(閉じるだけになってしまう。)

下記は一応、質問事項のみに関連する簡易版サンプルを抽出して作ってみました。
UIButton→textField.becomeFirstResponder
pickerView表示→「手動入力」を選んだら、keyboardに表示を切り替えたい。

Swift

1import UIKit 2 3class InputViewController: UIViewController, UITextFieldDelegate, UIPickerViewDelegate, UIPickerViewDataSource { 4 5 @IBOutlet weak var textField0: UITextField! 6 var toolbar = UIToolbar() 7 var pickerView = UIPickerView() 8 var pickerList:[String] = [] 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 textField0.delegate = self 13 self.toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 0, height: 35)) 14 let cancelItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(InputViewController.cancel)) 15 let spacerItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 16 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(InputViewController.done)) 17 self.toolbar.setItems([cancelItem, spacerItem, doneItem], animated: true) 18 self.pickerList = ["選択肢0", "選択肢1", "選択肢2", "選択肢3", "選択肢4", "手動入力(5)"] 19 self.pickerView.delegate = self 20 self.pickerView.dataSource = self 21 } 22 23 @objc func cancel() { 24 self.textField0.resignFirstResponder() 25 } 26 27 @objc func done() { 28 self.textField0.resignFirstResponder() 29 if self.pickerView.selectedRow(inComponent: 0) == 5 { 30 // ここで困ってます。 31 self.textField0.becomeFirstResponder() 32 } 33 } 34 35 @IBAction func btnPressed(_ sender: UIButton) { 36 self.textField0.inputView = pickerView 37 self.textField0.inputAccessoryView = toolbar 38 self.textField0.becomeFirstResponder() 39 }

苦肉の策として、mockTextFieldを新たに作って、

Swift

1 2func done() { 3 if self.pickerView.selectedRow(inComponent: 0) == 5 { 4 self.mockTextField.becomeFirstResponder() 5 } 6} 7 8func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 9 self.textField0.text = self.textField 10 return true 11}

としてみましたが、1文字遅れで表示されて、思うように動かせていません。
解決策のヒントでもいただけると幸いです。

///////////////////////////////////_/
以下、更新分(1/8)

Swift

1import UIKit 2 3class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate { 4 5 @IBOutlet weak var textView: UITextField! 6 var pickerView = UIPickerView() 7 var toolbar = UIToolbar() 8 var pickerList:[String] = [] 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 // Do any additional setup after loading the view, typically from a nib. 13 14 textView.delegate = self 15 toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 0, height: 35)) 16 let cancelItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(ViewController.cancel)) 17 let spacerItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 18 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(ViewController.done)) 19 toolbar.setItems([cancelItem, spacerItem, doneItem], animated: true) 20 self.pickerView.delegate = self 21 self.pickerView.dataSource = self 22 23 self.pickerList = ["選択肢1", "選択肢2", "選択肢3", "手動入力"] 24 self.textField.inputView = self.pickerView 25 self.textField.inputAccessoryView = self.toolbar 26 27 } 28 29 // UITextField 30 func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { 31 return true 32 } 33 34 @objc func cancel() { 35 self.textView.resignFirstResponder() 36 } 37 38 @objc func done() { 39 print("ここ入ってるよ") 40 self.textView.resignFirstResponder() 41 self.textView.inputView = nil 42 self.textView.becomeFirstResponder() 43 } 44 45 // PickerView 46 func numberOfComponents(in pickerView: UIPickerView) -> Int { 47 return 1 48 } 49 50 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 51 return self.pickerList.count 52 } 53 54 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 55 return self.pickerList[row] 56 } 57 58 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 59 } 60 61}

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

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

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

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

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

guest

回答1

0

ベストアンサー

手元でもう少し簡易版を作って試した感じでは

swift

1textField.resignFirstResponder() 2textField.inputView = nil 3textField.becomeFirstResponder()

というようにresign→インプットビューをnil→becomeという流れでpickerViewからkeyboardへの切り替えは動きました。

「// ここで困ってます。」のところでtextField0.inputView = nilを入れてみるとどうですか?

投稿2019/01/08 04:57

takabosoft

総合スコア8356

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

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

hameji001

2019/01/08 10:32 編集

takabosoftさん、回答ありがとうございます。 グジャグジャ本来は下に書いてましたが、ちょっとした凡ミスがあり、 それを直したところ、takabosoftさんの示唆の通り、nilで解決できました。 .noneやself.textField0 = UITextField()などやってみてましたが、 簡単なnilでいいんですね。盲点でした。 本当、助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問