web-dev-qa-db-ja.com

ターンキーを押したときにSwiftでキーボードを隠すには?

私はUITextfiedを使ってtextfiedキーボードをクリックしていますが、私が押したとき return キー、キーボードは消えていません。私は以下のコードを使いました。

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

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

180

次の機能を使用して、アプリにキーボードを無効にさせることができます。

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

339
rsc

このreturn trueの部分は、テキストフィールドに返すことが許可されているかどうかを伝えるだけです。
あなたは手動でキーボードを消すようにテキストフィールドに指示しなければなりません(あるいはその最初の応答者が何であるか)、そしてこれは以下のようにresignFirstResponder()で行われます:

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

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder()
    return true
}
90
Mick MacCallum
  • クラス宣言にUITextFieldDelegateを追加します。

    class ViewController: UIViewController, UITextFieldDelegate
    
  • textfieldを接続するか、プログラム的に書いてください

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

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
    
  • 以下の機能を追加

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

    これだけでは、キーボードはテキストフィールドの外側をタッチするだけでなくリターンキーを押すことで消え始めます。

43
Satnam Sync

Simple Swift 3 Solution:テキストフィールドを特徴とするView Controllerにこの機能を追加してください。

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

次に、アシスタントエディタを開き、Main.storyboardがビューの一方の側にあり、目的のView Controller.Swiftファイルがもう一方の側にあることを確認します。テキストフィールドをクリックして、右側のユーティリティパネルの[Show the Connection Inspector]タブを選択します。 Swiftファイルの '終了時の終了位置'から上記の機能へのドラッグを制御します。そのシーン内の他のテキストフィールドについても同じ手順を繰り返し、同じ機能にリンクします。

22
elarcoiris

@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); }

13
Tobias F. Meier

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

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

アウトレットの名前をtextFieldに置き換えます。

11
peacetype

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

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

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

10
James Thompson

Swift 4.2 - デリゲートは不要

" Primary Action Triggered "のUITextFieldからアクションアウトレットを作成し、渡された送信者パラメータでファーストレスポンダを辞退することができます。

Create Action Outlet

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

超簡単です。

(Scott Smithの60秒のビデオで、この点について教えてくれてありがとう: https://youtu.be/v6GrnVQy7iA

9
Mark Moeykens

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

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

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

8
Ian Seth Colin

SRCからクラスを開始することをお勧めします。

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;
}

}

7
LAOMUSIC ARTS

これがpeacetypeのコメントに対するSwift 3.0の更新です。

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

スイフト3

このコードをあなたのVCに追加してください

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

私のために働く

5
Gilad Brunfman

迅速

UITextFieldDelegateからのオプション関数の使用.

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

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

3
dimpiax

あなたはこれをUIButtonではなくどこにでも置くことができます

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

それからあなたはボタンにこのコードを入れることができます(これもまた例えば):

self.view.endEditing(true)

これは私のために働いた

2
Blake Scott

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

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にドラッグ)

2
Wu Yuan Chun

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

self.textField.delegate = self
2
Miladinho

使用している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);
    }
2
kanishk verma
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)
}
0
Santi RibeiroO