Returnキーを押すとすぐにキーボードを非表示にする方法は?


214

私はUITextfiedテキスト化されたキーボードをクリックしながら使用していますが、押すとreturnキーを押してもキーボードが消えません。私は次のコードを使用しました:

func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore.
{
    return true;
}

メソッドresignfirstresponderが機能していません。


10
RSC回答の受け入れを検討しましたか?答えを受け入れることがこの場所を機能させるものであり、良い習慣と見なされています。
ファンボエロ2015年

7
いずれかの回答が要件を満たしている場合は、回答としてマークを付けて、他の人がその回答を利用できるようにしてください。
Syed Md。Kamruzzaman 2016年

回答:


397

次の関数を使用して、アプリでキーボードを閉じることができます

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true)
    return false
}

以下は、よりわかりやすくするための完全な例です。

//
//  ViewController.swift
//
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var myTextField : UITextField

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.myTextField.delegate = self
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }
}

コードソース:http : //www.snip2code.com/Snippet/85930/swift-delegate-sample


22
「self.myTextField.delegate = self;」がありませんでした。ありがとうございました!
タイラーリンデル2014

4
私は欠けていましたUITextFieldDelegate
チェザーレ

1
@kommradHomer、間違いなくキーボードが表示されない原因が他にもあります。必要に応じて、コードをペーストビンに入れ、ここにリンクを貼り付けて、私が見られるようにします。
rsc 2015年

1
@RSCあなたはおそらく正しいでしょう。私は
iOSの

1
だから私のために働く(スウィフト3): func textFieldShouldReturn(textField: UITextField) -> Bool {変更 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
sea-kg

112

このreturn true部分は、テキストフィールドに返すことが許可されているかどうかを伝えるだけです。
テキストフィールドに手動でキーボード(またはその最初のレスポンダーが何であるか)を閉じるように指示する必要があり、これは次のresignFirstResponder()ようにで行われます。

// Called on 'Return' pressed. Return false to ignore.

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

2
おかげで...私の場合、「resignFirstResponder()」メソッドは自動的に取得されず、サポートしていないと思いましたが、手動で作成しているときにうまく機能しました。探しているおかげで。
Ashwinkumar Mangrulkar 14年

@AshwinMangrulkarは、Xcode 6のベータ版の自動補完機能がハンディキャップになる可能性があることを期待できます。
Paul Brewczynski、2014

1
そしてもちろん、「true」の後のセミコロンはもう必要ありません
36 By Design

1
あなたのviewControllerが準拠することは要件ではありませんUITextFieldDelegateか?
ハニー、

1
代わりself.view.endEditing()のこの回答は、適切かつ正確なアプローチである
saigen

45
  • UITextFieldDelegateクラス宣言に追加:

    class ViewController: UIViewController, UITextFieldDelegate
  • 接続するtextfieldか、プログラムで記述します

    @IBOutlet weak var userText: UITextField!
  • ビューのデリゲートテキストフィールドが読み込まれたときにビューコントローラーを設定します。

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
  • 次の関数を追加します

    func textFieldShouldReturn(userText: UITextField!) -> Bool {
        userText.resignFirstResponder()
        return true;
    }

    これらすべてを使って、キーボードはテキストフィールドの外側をタッチすることで、またリターンキーを押すことで消えます。


ありがとう!私はこれを逃していました:UITextFieldDelegate...どうもありがとう!
Adriano Tadao

何らかの理由で、txtField.delegate = selfを設定すると、アプリを実行するとそのテキストフィールド内に入力できません
Jesus Rodriguez

@JesusAdolfoRodriguezそのエラーの背後には理由があるはずです。このコードは問題を引き起こしません。:Dハッピーコーディング!
Codetard

一歩一歩ありがとうございました。これは、コードのブロックよりも私にとってより役に立ちました。
ケンケリー2016

1
「これがすべてあると、キーボードはテキストフィールドの外側をタッチすることで消え始めます」-正しくありません textFieldShouldReturnは、戻るボタンが押されたときにのみ呼び出されます。
Jurasic 16

38

Swift 4.2-デリゲートは不要

プライマリアクションがトリガーされました」のUITextFieldからアクションアウトレットを作成し、渡された送信者パラメーターでファーストレスポンダを再署名できます。

アクションアウトレットを作成

@IBAction func done(_ sender: UITextField) {
    sender.resignFirstResponder()
}

超シンプル。

(これについて私に教えてくれたスコット・スミスの60秒のビデオに感謝:https : //youtu.be/v6GrnVQy7iA


ページに複数のテキストフィールドがある場合、各テキストフィールドに対してそれを行う必要がありますか
DragonFire

@DragonFire同じアウトレットに複数のテキストフィールドを割り当てることができます。アウトレットインスペクタ(画面の左側)のプライマリアクショントリガーアウトレットからコードのIBActionにドラッグするだけ
Brad Root

ストーリーボードのテキストフィールドから直接ドラッグすると、リンクされたアクションが、プライマリアクションがトリガーされるのではなく、編集終了にデフォルトで設定されるため、サイドバーの接続インスペクターから行う必要があります。
クラウド

すごい。それは知らなかった。ありがとう。
Numan Karaaslan、

まだ気になっている場合は、Swift 2でも動作します。ありがとう。
siralexsir88

22

Simple Swift 3ソリューション:テキストフィールドを備えたビューコントローラーにこの関数を追加します。

@IBAction func textField(_ sender: AnyObject) {
    self.view.endEditing(true);
}

次に、アシスタントエディターを開き、Main.storyboardがビューの片側にあり、目的のビューのcontroller.swiftファイルが反対側にあることを確認します。テキストフィールドをクリックし、右側のユーティリティパネルの[接続インスペクタを表示]タブから選択します。「終了時に終了」から、swiftファイルの上記の関数へのドラッグを制御します。そのシーンの他のテキストフィールドについて繰り返し、同じ関数にリンクします。


14

@RSC

Xcodeバージョン6.2(6C86e)での重要な追加は override func viewDidLoad()

 self.input.delegate = self;

私があなたの投稿、RSCを見つけるまで、何時間もそれをリターンキーで動作させることを試みました。ありがとうございました!

また、画面の他の場所をタッチした場合にキーボードを非表示にするには、次のようにします。

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true);
    }

12

キーボードを自動的に閉じるには、このコードをカスタムテキストフィールドのクラスのメソッドの1つに配置します。

textField.addTarget(nil, action:"firstResponderAction:", forControlEvents:.EditingDidEndOnExit)

をコンセントの名前に置き換えますtextField


1
未解決の。これは私の考えでは最短かつ最良のオプションです。特に、別のメソッド内にテキストフィールドを作成している場合。テーブルビューヘッダーの内部のように。
角兵衛

申し訳ありませんが、これを正確にどこに置く必要があり、キーボードを閉じるには何をしなければなりませんか?私はmytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(Swift 5バージョン)を挿入しましたviewDidLoadが、テキストフィールドの外側のどこかでリターンもタップも機能しませんでした。アウトレットをそれぞれ作成して、テキストフィールドを取得しました。
ネフ

UIViewControllerから継承するカスタムクラスのサブクラスに配置します。サブクラスは、UITextViewDelegateおよびUITextFieldDelegateにも準拠しています。viewDidAppearそのクラスのメソッドに入れました。UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })これは私の場合に少し具体的すぎるかもしれませんが、うまくいけばそれが役立つでしょう。viewDidAppear必要に応じて、デリゲート内で呼び出しを行い、デリゲートに準拠してみてください。
peacetype

10

これを行うもう1つの方法は、ほとんどがストーリーボードを使用し、簡単に複数のテキストフィールドを使用できるようにする方法です。

@IBAction func resignKeyboard(sender: AnyObject) {
    sender.resignFirstResponder()
}

そのビューコントローラーのすべてのテキストフィールドをDid End On Exit、各フィールドのイベントのアクションに接続します。


申し訳ありませんが、アプリでこの方法を試してみましたが、機能していないようです。ナビゲーションバーにテキストフィールドがあり、あなたが言ったようにそれをそのイベントでこのアクションに接続しましたが、ランタイムでは機能しません。
wasimsandhu 2016年

送信者のタイプがUIBarButtonItemの場合、これはクラッシュします。[完了]ボタン付きのツールバーをテンキーに追加すると、インスタンスログに送信される認識されないセレクターによってコードがクラッシュします。
Jayprakash Dubey

8

RSCからクラスを初期化することをお勧めします。

import Foundation
import UIKit

// Don't forget the delegate!
class ViewController: UIViewController, UITextFieldDelegate {

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

@IBOutlet var myTextField : UITextField?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.myTextField.delegate = self;
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    self.view.endEditing(true);
    return false;
}

}


8

ユーザーがテキストキーボードの[完了]ボタンをタップすると、Did End On Exitイベントが生成されます。そのとき、キーボードが消えるように制御を放棄するようにテキストフィールドに指示する必要があります。そのためには、コントローラクラスにアクションメソッドを追加する必要があります。ViewController.swiftを選択して、次のアクションメソッドを追加します。

@IBAction func textFieldDoneEditing(sender: UITextField) {
sender.resignFirstResponder()}

プロジェクトナビゲーターでMain.storyboardを選択し、接続インスペクターを表示します。[終了時に終了]の横の円からストーリーボードの黄色のビューコントローラーアイコンにドラッグして、離します。小さなポップアップメニューが表示され、追加した1つのアクションの名前が示されます。textFieldDoneEditingアクションをクリックして選択し、それだけです。


8

以下は、peacetypeのコメントに対するSwift 3.0の更新です。

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)

これは
明確

これは受け入れられる答えになるはずです。1回の試行で作業しました。
Jaswant Singh

7

すべてのUIViewControllerに同じ関数を追加するのは嫌です。UIViewControllerDelegateをサポートするようにUIViewControllerを拡張することにより、「Return Pressed」のデフォルトの動作を提供できます。

extension UIViewController: UITextFieldDelegate{
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true;
    }
}

新しいUIViewControllerとUITextFieldを作成するときは、UIViewControllerに1行のコードを記述するだけです。

override func viewDidLoad() {
    super.viewDidLoad()
    textField.delegate = self
}

Main.storyboardでデリゲートをフックすることで、この1行のコードを省略することもできます。(「ctrl」を使用して、UITextFieldからUIViewControllerにドラッグします)


5

スウィフト3

以下のコードをVCに追加してください

//hide keyboard when user tapps on return key on the keyboard
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true);
    return false;
}

私のために働く


3

textFieldデリゲートが、textfield関連のコードを書き込んでいるビューコントローラーに設定されていることを確認してください。

self.textField.delegate = self

3

迅速

からのオプション機能の使用UITextFieldDelegate

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    return textField.endEditing(false)
}

falseフィールドは辞任を要求できることを意味します。true–強制的に辞任する。


3
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleScreenTap(sender:)))
    self.view.addGestureRecognizer(tap)}

次に、この関数を使用します

func handleScreenTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}

2

これはどこにでも配置できますが、UIButtonには配置できません

 func TextFieldEndEditing(text fiend name: UITextField!) -> Bool
{
    return (false)
}

次に、このコードをボタンに配置できます(これも例として)。

self.view.endEditing(true)

これは私のために働いた


2

使用しているView Controllerで:

//suppose you are using the textfield label as this

@IBOutlet weak var emailLabel: UITextField!
@IBOutlet weak var passwordLabel: UITextField!

//then your viewdidload should have the code like this
override func viewDidLoad() {
        super.viewDidLoad()

        self.emailLabel.delegate = self
        self.passwordLabel.delegate = self

    }

//then you should implement the func named textFieldShouldReturn
 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

// -- then, further if you want to close the keyboard when pressed somewhere else on the screen you can implement the following method too:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true);
    }

私はtouchesBegan funcが好きで、迅速に動作します4ありがとうございます。
AJヘルナンデス


-1

オールインワンキーボードを非表示にしてキーボードを開いたときにビューを移動:Swift 5

override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: self, action: #selector(taped))
    view.addGestureRecognizer(tap)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}


   override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
 @objc func taped(){

    self.view.endEditing(true)

}

@objc func KeyboardWillShow(sender: NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y == 0{
        self.view.frame.origin.y -= keyboardSize.height
    }


}

@objc func KeyboardWillHide(sender : NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y != 0{
        self.view.frame.origin.y += keyboardSize.height
    }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.