web-dev-qa-db-ja.com

Swiftを使ってどこかに触れてiOSキーボードを閉じます

私はずっとこれを探していましたが、私はそれを見つけることができないようです。私はObjective-Cを使ってキーボードを消す方法を知っていますが、Swiftを使ってキーボードを消す方法がわかりませんか?誰か知っている?

338
lagoon
override func viewDidLoad() {
    super.viewDidLoad()

    //Looks for single or multiple taps. 
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")

    //Uncomment the line below if you want the tap not not interfere and cancel other interactions.
    //tap.cancelsTouchesInView = false 

    view.addGestureRecognizer(tap)
}

//Calls this function when the tap is recognized.
func dismissKeyboard() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)
}

あなたが複数のUIViewControllersでこの機能を使うつもりであるならば、これはこのタスクをするもう一つの方法です:

// Put this piece of code anywhere you like
extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
        tap.cancelsTouchesInView = false            
        view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard() {
        view.endEditing(true)
    }
}

すべてのUIViewControllerにおいて、あなたがしなければならないのはこの関数を呼び出すことだけです:

override func viewDidLoad() {
    super.viewDidLoad()
    self.hideKeyboardWhenTappedAround() 
}

この関数は私のリポジトリに標準の関数として含まれています。この関数には便利なSwift Extensionsがたくさん含まれています。 https://github.com/goktugyil/EZSwiftExtensions

1127
Esqarrouth

下記のSwiftを使ってXcode 6.1でキーボードを消す方法についてのあなたの質問に対する答え:

import UIKit

class ItemViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textFieldItemName: UITextField!

    @IBOutlet var textFieldQt: UITextField!

    @IBOutlet var textFieldMoreInfo: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        textFieldItemName.delegate = self
        textFieldQt.delegate = self
        textFieldMoreInfo.delegate = self
    }

                       ...

    /**
     * Called when 'return' key pressed. return NO to ignore.
     */
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }


   /**
    * Called when the user click on the view (outside the UITextField).
    */
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }

}

この情報の出所 )。

109
King-Wizard

あなたは呼び出すことができます

resignFirstResponder()

uITextFieldなどのUIResponderの任意のインスタンスで。現在キーボードが表示されているビューでそれを呼び出すと、キーボードは消えます。

34
Dash

スイフト4作業

以下のように拡張子を作成し、Base View ControllerでhideKeyboardWhenTappedAround()を呼び出します。

//
//  UIViewController+Extension.Swift
//  Project Name
//
//  Created by ABC on 2/3/18.
//  Copyright © 2018 ABC. All rights reserved.
//

import UIKit

extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tapGesture = UITapGestureRecognizer(target: self, 
                         action: #selector(hideKeyboard))
        view.addGestureRecognizer(tapGesture)
    }

    @objc func hideKeyboard() {
        view.endEditing(true)
    }
}
26
Fahim Parkar
//Simple exercise to demonstrate, assuming the view controller has a //Textfield, Button and a Label. And that the label should display the //userinputs when button clicked. And if you want the keyboard to disappear //when clicken anywhere on the screen + upon clicking Return key in the //keyboard. Dont forget to add "UITextFieldDelegate" and 
//"self.userInput.delegate = self" as below

import UIKit

class ViewController: UIViewController,UITextFieldDelegate {

    @IBOutlet weak var userInput: UITextField!
    @IBAction func transferBtn(sender: AnyObject) {
                display.text = userInput.text

    }
    @IBOutlet weak var display: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

//This is important for the textFieldShouldReturn function, conforming to textfieldDelegate and setting it to self
        self.userInput.delegate = self
    }

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

//This is for the keyboard to GO AWAYY !! when user clicks anywhere on the view
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }


//This is for the keyboard to GO AWAYY !! when user clicks "Return" key  on the keyboard

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

}
19
Naishta

swift 3では、とても簡単です。

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

戻るキーを押したときにキーボードを隠したい場合

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

しかし2番目のケースでは、Main.StoryboardのすべてのtextFieldからViewControllerにデリゲートを渡す必要もあります。

17
Yerbol

Swift 3:キーボードを消す最も簡単な方法:

  //Dismiss keyboard method
    func keyboardDismiss() {
        textField.resignFirstResponder()
    }

    //ADD Gesture Recignizer to Dismiss keyboard then view tapped
    @IBAction func viewTapped(_ sender: AnyObject) {
        keyboardDismiss()
    }

    //Dismiss keyboard using Return Key (Done) Button
    //Do not forgot to add protocol UITextFieldDelegate 
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        keyboardDismiss()

        return true
    }
10
NikaE

ダッシュの答えは正解であり好ましいです。もっと "焦土"のアプローチはview.endEditing(true)を呼び出すことです。これはviewとそのすべてのサブビューをresignFirstResponderにします。却下したいビューへの参照がない場合、これはハッキーだが効果的な解決策です。

個人的には、私はあなたがあなたが最初のレスポンダーを辞任させたいのだという意見への参照を持つべきだと思います。 .endEditing(force: Bool)は野蛮なアプローチです。使わないでください。

10
modocache

絵コンテでは:

  1. tableViewを選択します
  2. 右側から、属性インスペクタを選択します。
  3. キーボードセクションで - あなたが望む解雇モードを選択してください
9
goggelj

スイフト3:

Dismiss関数で追加の処理を行うことができるようにSelectorをパラメータとして拡張し、cancelsTouchesInViewを使用してビューの他の要素へのタッチによる歪みを防止します。

extension UIViewController {
    func hideKeyboardOnTap(_ selector: Selector) {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: selector)
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }
}

使用法:

override func viewDidLoad() {
    super.viewDidLoad()
    self.hideKeyboardOnTap(#selector(self.dismissKeyboard))
}

func dismissKeyboard() {
    view.endEditing(true)
    // do aditional stuff
}
9
David Seek

![キーボードを無効にする方法] [1]

import UIKit

class ViewController: UIViewController,UITextFieldDelegate {

   @IBOutlet weak var username: UITextField!
   @IBOutlet weak var password: UITextField!

   override func viewDidLoad() {
      super.viewDidLoad() 
      username.delegate = self
      password.delegate = self
      // Do any additional setup after loading the view, typically from a nib.
   }

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

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

   override func touchesBegan(_: Set<UITouch>, with: UIEvent?) {
     username.resignFirstResponder()
     password.resignFirstResponder()
     self.view.endEditing(true)
  }
}
8
hardik bar

Swift 4では、@ objcを追加します。

ViewDidLoadでは、

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

関数:

@objc func dismissKeyboard() {
  view.endEditing(true)
}
6
user3856297

あなたがスクロールビューを使うならば、それはずっと簡単かもしれません。

ストーリーボードでDismiss interactivelyを選択するだけです。

6
JIE WANG
  import UIKit

  class ItemViewController: UIViewController, UITextFieldDelegate {

  @IBOutlet weak var nameTextField: UITextField!

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

    // Called when 'return' key pressed. return NO to ignore.

    func textFieldShouldReturn(textField: UITextField) -> Bool {

            textField.resignFirstResponder()
             return true
     }

 // Called when the user click on the view (outside the UITextField).

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

初心者プログラマーとして、人々がより熟練した、不必要な反応をするとき、それは混乱するかもしれません...あなたは上に示されたどんな複雑なこともする必要はありません!...

これが最も簡単なオプションです。キーボードがテキストフィールドに応答して表示される場合 - タッチスクリーン機能の中に resignFirstResponder 機能を追加するだけです。以下に示すように - First Responderが解放された(Responderチェーンから出る)ためにキーボードが閉じます...

override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
    MyTextField.resignFirstResponder()
}
5
RedSky

私は最善の解決策がいくつかの調整を加えた@Esqarrouthからの受け入れられた答えを含んでいるのを見つけました:

extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboardView")
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    func dismissKeyboardView() {
        view.endEditing(true)
    }
}

tap.cancelsTouchesInView = falseという行は非常に重要でした。これは、UITapGestureRecognizerがビュー上の他の要素によるユーザーの操作を妨げないようにするためです。

メソッドdismissKeyboard()は、ややエレガントさの低いdismissKeyboardView()に変更されました。これは、私のプロジェクトのかなり古いコードベースでは、dismissKeyboard()が既に使われていたことが何度もあり(これが珍しくないと思う)、コンパイラの問題を引き起こしているからです。

その後、上記のように、この動作は個々のビューコントローラで有効にできます。

override func viewDidLoad() {
    super.viewDidLoad()
    self.hideKeyboardWhenTappedAround() 
}
5
Luke Harries

この拡張子をViewControllerに追加してください。

  extension UIViewController {
// Ends editing view when touches to view 
  open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    self.view.endEditing(true)
  }
}
4

この1つのライナーは、UIView内のすべての(任意の)UITextFieldからキーボードを辞任します。

self.view.endEditing(true)
4
Satnam Sync

Swiftではあなたが使うことができます

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

}
4
bernard rayoso

キーボードにはIQKeyBoardManagerSwiftを使っています。使い方は簡単です。ポッドに 'IQKeyboardManagerSwift'を追加するだけです。

IQKeyboardManagerSwiftをインポートし、didFinishLaunchingWithOptionsAppDelegateにコードを書き込みます。

///add this line 
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true
4

私はいつも以下を使います。

UIApplication.shared.keyWindow?.endEditing(true)

あるいは拡張としても:

extension UIApplication {

    /// Dismiss keyboard from key window.
    /// Example Usage: `UIApplication.endEditing(true)`.
    ///
    /// - Parameters:
    ///     - force: specify `true` to force first responder to resign.
    open class func endEditing(_ force: Bool = false) {
        shared.keyWindow?.endEditing(force)
    }
}

このように、私が編集をキャンセルしようとしているクラスがviewプロパティを持っていないかUIViewのサブクラスではない場合、UIApplication.endEditing(true)を呼び出すことができます。

4
NoodleOfDeath

Swift3の場合

ViewDidLoadにイベントレコグナイザーを登録する

let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))

それから、同じviewDidLoadのビューにジェスチャを追加する必要があります。

self.view.addGestureRecognizer(tap)

それから登録されたメソッドを初期化する必要があります

func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
    view.endEditing(true)
}
3
Sandu

他にもタッチを受け取るべきビューがある場合は、cancelsTouchesInView = falseを設定する必要があります

このような:

let elsewhereTap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    elsewhereTap.cancelsTouchesInView = false
    self.view.addGestureRecognizer(elsewhereTap)
2
ph1lb4

もう1つの可能性は、あなたが触れる必要があるかもしれないすべてのビューの下に横たわっているコンテンツのない大きなボタンを単に追加することです。次のような名前を付けます。

@IBAction func dismissKeyboardButton(sender: AnyObject) {
    view.endEditing(true)
}

ジェスチャーレコグナイザーの問題は私にはありました、それはまた私がtableViewCellsによって受けたがっていたすべての接触をつかまえたということでした。

2
Timm Kent
override func viewDidLoad() {
        super.viewDidLoad()

self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))

}

func tap(sender: UITapGestureRecognizer){
        print("tapped")
        view.endEditing(true)
}

これを試して、それは働いています

2

私はあなたに有名になりました

override func viewDidLoad() {
    super.viewDidLoad() /*This ensures that our view loaded*/
    self.textField.delegate = self /*we select our text field that we want*/   
    self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: Selector("dismissKeyboard")))
}

func dismissKeyboard(){ /*this is a void function*/
    textField.resignFirstResponder() /*This will dismiss our keyboard on tap*/
}
1
ChannelJuanNews

私はuisearchbarについて考え出しました。私のところを見てください。

import UIKit

class BidderPage: UIViewController,UISearchBarDelegate,UITableViewDataSource {

     let recognizer = UITapGestureRecognizer()

// Set recogniser as public in case of tableview and didselectindexpath.


    func searchBarTextDidBeginEditing(searchBar: UISearchBar)

    {

        recognizer.addTarget(self, action: "handleTap:")
        view.addGestureRecognizer(recognizer)

    }

    func handleTap(recognizer: UITapGestureRecognizer) {
        biddersearchbar .resignFirstResponder()
    }
    func searchBarTextDidEndEditing(searchBar: UISearchBar)
    {
        view .removeGestureRecognizer(recognizer)

    }
1
A.G

viewDidLoad()メソッドの1行のコード:

view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
1
Artem

ビューに複数のテキストフィールドがある場合

@ modocacheの推奨に従うview.endEditing()を呼び出さないようにするには、最初のレスポンダになったテキストフィールドを追跡することができますが、それは面倒でエラーが発生しやすいものです。

別の方法としては、ビューコントローラのすべてのテキストフィールドでresignFirstResponder() を呼び出すことです 。これは、すべてのテキストフィールドのコレクションを作成する例です(私の場合は検証コードにとにかく必要でした)。

@IBOutlet weak var firstName: UITextField!
@IBOutlet weak var lastName: UITextField!
@IBOutlet weak var email: UITextField!

var allTextFields: Array<UITextField>!  // Forced unwrapping so it must be initialized in viewDidLoad
override func viewDidLoad()
{
    super.viewDidLoad()
    self.allTextFields = [self.firstName, self.lastName, self.email]
}

利用可能なコレクションがあれば、それらすべてを反復処理するのは簡単なことです。

private func dismissKeyboard()
{
    for textField in allTextFields
    {
        textField.resignFirstResponder()
    }
}

だから今、あなたはあなたのジェスチャーレコグナイザーでdismissKeyboard()を呼び出すことができます(あるいはあなたにふさわしいところならどこでも)。欠点は、フィールドを追加または削除するときにUITextFieldのリストを管理する必要があるということです。

コメントは大歓迎です。ファーストレスポンダではないコントロールでresignFirstResponder()を呼び出すことに問題がある場合、または現在のファーストレスポンダを追跡するための簡単で保証されたバグのない方法がある場合は、それについて知りたいです。

1
stone

これを簡潔に行う方法は次のとおりです。

let endEditingTapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:)))
endEditingTapGesture.cancelsTouchesInView = false
view.addGestureRecognizer(endEditingTapGesture)
1
Sam

私はこれを好む ワンライナー

view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "dismissKeyboardFromView:"))

それをオーバーライドするviewDidLoad関数にサブクラス化したUIViewControllerのいずれかに配置してから、次のコードをプロジェクトの新しい空のファイル "UIViewController + dismissKeyboard.Swift"に配置します。

import UIKit

extension UIViewController {
    // This function is called when the tap is recognized
    func dismissKeyboardFromView(sender: UITapGestureRecognizer?) {
        let view = sender?.view
        view?.endEditing(true)
    }
}
1
gammachill

キーボードを辞任するためにタップジェスチャー認識機能を追加することもできます。 :D

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

    let recognizer = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
    backgroundView.addGestureRecognizer(recognizer)
}
    func handleTap(recognizer: UITapGestureRecognizer) {
    textField.resignFirstResponder()
    textFieldtwo.resignFirstResponder()
    textFieldthree.resignFirstResponder()

    println("tappped")
}
1
Satnam Sync

私はこの単純な解決策を見つけました:1.あなたのView ControllerにUITapGestureRecognizerを追加します2.あなたのUITapGestureRecognizerにIBActionを追加します3.最後にあなたはファーストレスポンダを辞任することができます

class ViewController: UIViewController
{

@IBOutlet var tap: UITapGestureRecognizer!
@IBOutlet weak var label: UILabel!
@IBOutlet weak var textField: UITextField!
override func viewDidLoad()
{
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}


@IBAction func dismissUsingGesture(_ sender: UITapGestureRecognizer)
{
   self.textField.resignFirstResponder()
    label.text = textField.text!
}
}
1
Atka

Swift 5 たった2行で十分です。 viewDidLoadを追加すればうまくいくはずです。

 let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
 view.addGestureRecognizer(tapGesture)

タップジェスチャで他のタッチがブロックされている場合は、次の行を追加してください。

tapGesture.cancelsTouchesInView = false
0
William Hu

スイフト3

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

Swift4 + RxSwiftの例(RxGestureもインポート)

view.rx.tapGesture()
        .when(GestureRecognizerState.recognized)
        .subscribe({ _ in
            self.view.endEditing(true)
        })
        .disposed(by: disposeBag)
0
norbDEV

私の@ King-Wizardの答えの編集が拒否されて以来、新しい答えとして投稿しています。

クラスをUITextFieldのデリゲートにして、touchesBeganをオーバーライドします。

スイフト4

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textField: UITextField!

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

    //Called when 'return' key is pressed. Return false to keep the keyboard visible.
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        return true
    }

    // Called when the user clicks on the view (outside of UITextField).
    override func touchesBegan(touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

}
0
Viktor Seč