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

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

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

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

Swift

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

Q&A

解決済

1回答

1916閲覧

textField.resignFirstResponderでキーボードが閉じません。

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/06/22 15:51

編集2018/06/23 02:27

現在UItextFieldに文字を入力して、それをUILabelに表示する様なアプリを作っていて、実現できています。
その中で、キーボードのreturnをタップして単純にキーボードを閉じたいのですが、できていません。

func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true }

上記メソッドの他に、
viewDidLoad内にもtextField.delegate = selfがあり、
プロトコルにUITextFieldDelegateを追加していますが、閉じません。
調べていますが、原因がわからないため質問します。

よろしくお願いします。

//textFieldのあるモーダルビュー(ModalViewController)を追記しました。
参考にしたドキュメントです

import UIKit class ModalViewController: UIViewController, UITextFieldDelegate { var changeButton = UIButton() var textField = UITextField() override func viewDidLoad() { super.viewDidLoad() set() } func set() { view.backgroundColor = .gray let cancelButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 30)) cancelButton.center = CGPoint(x: view.center.x - 100, y: view.center.y) cancelButton.setTitle("キャンセル", for: .normal) cancelButton.setTitleColor(UIColor.black, for: .normal) cancelButton.addTarget(self, action: #selector(pushDismiss(sender:)), for: .touchUpInside) view.addSubview(cancelButton) // changeButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 30)) changeButton.center = CGPoint(x: view.center.x + 100, y: view.center.y) changeButton.setTitle("変更", for: .normal) changeButton.setTitleColor(UIColor.black, for: .normal) changeButton.addTarget(self, action: #selector(pushChange(sender:)), for: .touchUpInside) changeButton.isEnabled = false view.addSubview(changeButton) textField.delegate = self textField.text = "" textField = UITextField(frame: CGRect(x: 0, y: 0, width: view.bounds.width - 20, height: 30)) textField.center = CGPoint(x: view.center.x, y: view.center.y + 50) textField.placeholder = "入力してね" textField.backgroundColor = .white view.addSubview(textField) let center = NotificationCenter.default center.addObserver(・省略してます) } @objc func textFieldDidChange(notification: NSNotification) { if textField.text == "" { changeButton.isEnabled = false } else { changeButton.isEnabled = true } } func textFieldShouldReturn(_ textField: UITextField) -> Bool { DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.view.resignFirstResponder() } return true } //変更 @objc func pushChange(sender:UIButton) { textField.resignFirstResponder() let originVc = presentingViewController as! HomeViewController originVc.textFromModal = textField.text! self.dismiss(animated: true, completion: nil) } //キャンセル @objc func pushDismiss(sender:UIButton) { self.dismiss(animated: true, completion: nil) } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

func textFieldShouldReturn(_ textField: UITextField) -> Boolは前提として呼ばれているのですよね?

試しにスレッドを変えて、遅延させてみてください。

swift

1 2import UIKit 3 4class ViewController: UIViewController , UITextFieldDelegate{ 5 6 @IBOutlet weak var textField: UITextField! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 self.textField.dlegate = self 12 } 13 14 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 15 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 16 self.view.endEditing(true) 17  } 18 return true 19 } 20 21} 22 23

回答追記

swift

1textField = UITextField(frame: CGRect(x: 0, y: 0, width: view.bounds.width - 20, height: 30)) 2textField.center = CGPoint(x: view.center.x, y: view.center.y + 50) 3textField.delegate = self 4textField.text = "" 5textField.placeholder = "入力してね" 6textField.backgroundColor = .white 7view.addSubview(textField)

投稿2018/06/22 16:48

編集2018/06/23 02:45
_Kentarou

総合スコア8490

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

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

退会済みユーザー

退会済みユーザー

2018/06/23 02:07

_kentarou様 私ストーリーボードを使わずにコードのみで作っていまして、それが原因なのか上記のDispatch...を使用しても閉じないままでした...
_Kentarou

2018/06/23 02:13

コードだけで作っているのが原因ではないですが、、、 解決できるか分かりませんが、もし載せられたらコードを見てみたいです。 試しているのは、シュミレーター、実機のどちらですか?
退会済みユーザー

退会済みユーザー

2018/06/23 02:31

本文にコードを追記しました。見ていただけるとありがたいです。 URLリンク先の参考ドキュメントをほぼそのまま真似していて、+αで入力される文字数によって条件式などを用意してNotificationCenter.defaultで反映させています。 見て頂きたいです。お願いいたします。
_Kentarou

2018/06/23 02:46

あー。分かりました、delegateを設定したUITextFieldオブジェクトをその下で作り直してますね、、、 回答に追記しました。
退会済みユーザー

退会済みユーザー

2018/06/23 03:19

シミュレーター iphoneXで試しています。 すみません、 >>その下で作り直してますね 私の本文の textField.delegate = selfとtextField.text = "" の書いた位置が原因のため、Kentarou様の追記の通り書き直すという事でしょうか? 書き直しましたが閉じませんでした。
_Kentarou

2018/06/23 03:46 編集

こちらではdelegateの処理を追記したところに移動したら閉じました。 そもそもDelegateメソッドが呼ばれていなかったです。 そちらで閉じないということですが、returnのdelegateメソッドは呼ばれていますか? returnのDelegateメソッドの中はtextField.resignFirstResponder()のみに書き換えてください。
退会済みユーザー

退会済みユーザー

2018/06/23 04:00 編集

textFieldShouldReturnが呼ばれてることをprintで確認し、 textField.resignFirstResponder()のみに書き換え、 閉じることができました。ありがとうございます。 追記頂いた通り、textFieldのdelegateや= ""(未入力)を、 オブジェクトであるtextField = UITextField(frame...より下の位置に書かなければオブジェクトが新たにもう1つ作られてしまうということで、 狙ったDelegateメソッドが呼ばれず閉じなかったという事でしょうか?
_Kentarou

2018/06/23 04:04

オブジェクトが作り直される = オブジェクトに設定したDelegateも破棄されるということですね。 だから作りなおしたUITextFieldにはDelegateは設定されていなかった、です。
退会済みユーザー

退会済みユーザー

2018/06/23 04:09

ありがとうございます。理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問