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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

1回答

2887閲覧

textfieldのキーボードを強制的に閉じたい

tarofess

総合スコア127

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2016/12/27 14:42

編集2022/01/12 10:55

textfieldのキーボードを強制的に閉じようとしているのですがうまくいきません。
現在tableviewcellの中にtextfieldがあり、textFieldDidBeginEditingメソッドの中でendEditingやresignFirstResponderを呼んでいるのですがキーボードが閉じません。
現在のtableviewcellクラスのコードは以下のようになっています。デリゲートはStoryboardから引っ張ってきています。

swift

1class SettingEditTableViewCountryCell: UITableViewCell, UITextFieldDelegate { 2 3 @IBOutlet weak var countryTextField: UITextField! 4 5 override func awakeFromNib() { 6 super.awakeFromNib() 7 } 8 9 override func setSelected(_ selected: Bool, animated: Bool) { 10 super.setSelected(selected, animated: animated) 11 } 12 13 // MARK: - UITextFieldDelegate 14 15 func textFieldDidBeginEditing(_ textField: UITextField) { 16 self.endEditing(true) 17 } 18 19}

画面には他にもtextfieldがあり、textfieldがタップされた時にワケあって一つ前に表示されていたのtextfieldのキーボードを閉じたいのですが、どうすればキーボードを閉じることができるでしょうか?
どなたかわかる方がいれば教えていただきたいです。よろしくお願いします。

///追記///

swift

1// MARK :- UITableViewDataSource 2 3 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 4 return self.displayCells().count 5 } 6 7 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 8 let id = displayCells()[indexPath.row].rawValue 9 let cell = tableView.dequeueReusableCell(withIdentifier: id, for: indexPath) 10 self.configureCell(targetCell: cell, indexPath: indexPath) 11 12 return cell 13 } 14 15 func configureCell(targetCell: UITableViewCell, indexPath: IndexPath) { 16 let type = displayCells()[indexPath.row] 17 18 switch type { 19 case .image: 20 guard let cell = targetCell as? SettingEditTableViewImageCell else { 21 return 22 } 23 24 if let image = SettingManager.sharedInstance.settings["image"]?.flatMap({$0}) { 25 if let imageString = image as? String { 26 cell.imageButton.setImage(Converter.sharedInstance.convertStringToImage(imageString: imageString), for: .normal) 27 } 28 } else { 29 cell.imageButton.setImage(UIImage(named: "camera"), for: .normal) 30 } 31 32 case .name: 33 if let name = SettingManager.sharedInstance.settings["name"]?.flatMap({$0}) { 34 if let cell = targetCell as? SettingEditTableViewTextCell { 35 cell.textField.text = name as? String 36 } 37 } 38 39 case .country: 40 if let country = SettingManager.sharedInstance.settings["country"]?.flatMap({$0}) { 41 if let cell = targetCell as? SettingEditTableViewCountryCell { 42 cell.countryTextField.text = country as? String 43 } 44 } 45 46 case .comment: 47 if let comment = SettingManager.sharedInstance.settings["comment"]?.flatMap({$0}) { 48 if let cell = targetCell as? SettingEditTableViewTextCell { 49 cell.textField.text = comment as? String 50 } 51 } 52 } 53 } 54

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

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

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

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

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

guest

回答1

0

いろいろなところにTextFieldが配置してあると状態の把握に面倒になると思いますが、一旦閉じたいということであれば以下の様にしてみるのはいかがでしょうか?

以下のコードは簡単に説明する為にViewControllerに2つのキーボードが乗っているという想定にしています。

現在キーボードを表示しているかのフラグを判定してtextFieldShouldBeginEditingメソッドの中で表示するかしないかを判定しています。
※ このパターンを自分の状態に合わせて頑張ってみてください。

swift

1import UIKit 2 3class ViewController: UIViewController, UITextFieldDelegate { 4 5 @IBOutlet weak var textField1: UITextField! 6 @IBOutlet weak var textField2: UITextField! 7 8 var isShowKeyboard = false 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 textField1.delegate = self 14 textField2.delegate = self 15 } 16 17 // キーボードが表示される前に呼ばれるDelegateメソッド 18 func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { 19 20 // trueを返すとキーボードが表示される、falseを返すと表示されない 21 22 if isShowKeyboard { 23 24 // キーボードが出ていたら閉じる 25 view.endEditing(true) 26 isShowKeyboard = false 27 return false 28 } else { 29 30 // キーボードを表示する 31 isShowKeyboard = true 32 return true 33 } 34 } 35}

投稿2016/12/27 15:06

_Kentarou

総合スコア8490

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

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

tarofess

2016/12/27 23:00

ご回答ありがとうございます。textFieldShouldBeginEditingをご提示のコードのように実装したのですが、うまくいきませんでした。この処理をtableviewcellを継承したクラスで行なっていることが問題なのでしょうか?ご提示のコードの view.endEditing(true)は手元ではself.endEditing(true)にしています。
_Kentarou

2016/12/27 23:08

※ このパターンを自分の状態に合わせて頑張ってみてください。 と書いたのがtarofessさんがうまく行っていない部分です、セルを挟むとちょっと複雑になるのでシンプルな形で書きました。 一度私のコードで動きを確認、理解してからご自身のコードに当てはめてみてください。 これ以上は関係しているコードをすべて載せていただかないとこちらでもアドバイスできませんね。
tarofess

2016/12/28 12:11

ご提示いただいたパターンを元に色々とやってみたのですが全くできなかったので、tableviewのdatasourceに関するコードを追記しました。tableviewcellクラスからviewcontrollerにnotificationを飛ばしてviewcontrollerでキーボードを閉じるようにやったりしても全くキーボードは閉じず、どこに手をつけていいか分かりません。お手数をおかけしますが、お力添えをいただきたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問