上記を質問させてください。
今作成中のプログラムで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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/08 10:32 編集