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

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

ただいまの
回答率

90.53%

  • Swift

    7210questions

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

  • Xcode

    4082questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 153
退会済みユーザー

退会済みユーザー

現在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)
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

import UIKit

class ViewController: UIViewController , UITextFieldDelegate{

    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.textField.dlegate = self
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            self.view.endEditing(true)
       }
        return true
    }

}

回答追記

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.delegate = self
textField.text = ""
textField.placeholder = "入力してね"
textField.backgroundColor = .white
view.addSubview(textField)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/23 11:07

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

    キャンセル

  • 2018/06/23 11:13

    コードだけで作っているのが原因ではないですが、、、

    解決できるか分かりませんが、もし載せられたらコードを見てみたいです。

    試しているのは、シュミレーター、実機のどちらですか?

    キャンセル

  • 2018/06/23 11:31

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

    キャンセル

  • 2018/06/23 11:46

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

    キャンセル

  • 2018/06/23 12:19

    シミュレーター iphoneXで試しています。

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

    キャンセル

  • 2018/06/23 12:29 編集

    こちらではdelegateの処理を追記したところに移動したら閉じました。
    そもそもDelegateメソッドが呼ばれていなかったです。

    そちらで閉じないということですが、returnのdelegateメソッドは呼ばれていますか?

    returnのDelegateメソッドの中はtextField.resignFirstResponder()のみに書き換えてください。

    キャンセル

  • 2018/06/23 13:00 編集

    textFieldShouldReturnが呼ばれてることをprintで確認し、
    textField.resignFirstResponder()のみに書き換え、
    閉じることができました。ありがとうございます。


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

    キャンセル

  • 2018/06/23 13:04

    オブジェクトが作り直される = オブジェクトに設定したDelegateも破棄されるということですね。

    だから作りなおしたUITextFieldにはDelegateは設定されていなかった、です。

    キャンセル

  • 2018/06/23 13:09

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

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    swift Button タップ スワイプ

    現在、タップとスワイプの二つを一つのボタンで行おうとしています。 ボタンをタップしたらUIViewを出して ボタンをスワイプしたらそのボタンが指に沿って移動する・・・

  • 受付中

    classからUIButtonを作成したい

    viewcontrollerに複数のボタンを作成したいため、classを使って制御をしようと思いこのサイトを参考に作成しましたが、 self.view.addSubview(my

  • 解決済

    Swift3 カスタムボタンを使ってゴミ箱を作りたい

    Swift3でiOSアプリを作っています。 ボタンを生成して動かす事は出来ました。 ボタンをゴミ箱まで移動させて、そのボタンを削除したいと思います。 そこで移動中のカスタ

  • 解決済

    UIButtonにおけるsenderのanyとUIButtonの違いはなんですか。

    タイトルの通りなんですが、 anyとUIButtonの違いはなんでしょうか。 なんとなくanyの方が自由度が高いのはわかりますが、 どういった場合にそのanyが効いて

  • 解決済

    【Swift】Viewの座標位置の変換がうまくいかない。

    前提・実現したいこと UIViewに枠線をつけ画面中央に配置しており、その中に収まっている部分のUIImagewのimageを取得したいのです。 Viewに収まっている部分をc

  • 受付中

    Labelの座標について

    パスワードを入力して間違っていた時にLabelを「ブルブル」と横に振動させたいのですが、どのようにすればいいですか?

  • 受付中

    カメラアクセスと写真のアップロードができない

    作ったアプリでカメラアクセスと写真のアップロードができません。 Xcodeから自分のiPhoneでエミュレータを起動したのですが Camera access ボタンとPhoto

  • 受付中

    WKWebViewで進む・戻る・更新ボタンを実装したい

    WKWebViewで進む・戻る・更新ボタンを実装したいと考えております。 色々なサイトを参考にし下記のコードを記述しGoogleのHPを表示するところまで実装しております。

同じタグがついた質問を見る

  • Swift

    7210questions

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

  • Xcode

    4082questions

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