回答:
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.
@objc 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拡張機能を多く含むレポジトリの標準関数として含まれています。https://github.com/goktugyil/EZSwiftExtensionsを確認してください。
didSelectRowAtIndexPath
です。
tap.cancelsTouchesInView = false
。少なくとも私にとってはそれで解決しました。これが誰かの役に立つことを願っています
以下の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)
}
}
(この情報の出典)。
以下のように拡張機能を作成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)
}
}
すべてのビューコントローラーで常に呼び出す必要がないように、ベースビューコントローラーで呼び出すことが最も重要です。
電話できます
resignFirstResponder()
UITextFieldなどのUIResponderの任意のインスタンス。現在キーボードが表示されているビューで呼び出すと、キーボードが非表示になります。
//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
}
}
Swift 3の場合、それは非常に簡単です
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
RETURNキーを押したときにキーボードを非表示にする場合
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
ただし、2番目のケースでは、すべてのtextFieldからMain.StoryboardのViewControllerにデリゲートを渡す必要もあります。
unrecognized selector sent to instance
はこのコードで取得します。
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
}
Swift 5は2行で十分です。あなたのviewDidLoad
仕事に追加してください。
let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tapGesture)
タップジェスチャーが他のタッチをブロックした場合は、次の行を追加します。
tapGesture.cancelsTouchesInView = false
ストーリーボード:
スウィフト3:
Selector
パラメータとしての拡張機能により、dismiss関数で追加の処理を行うことができ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
}
IQKeyboardmanagerを使用すると、簡単に解決できます。
/////////////////////////////////////////
![キーボードを無効にする方法..] [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)
}
}
私は最良の解決策として、@ 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()
は、すでに使用されていることが何度もあったため(これは珍しいことではないと思います)、コンパイラーの問題を引き起こしています。
次に、上記のように、この動作を個々のView Controllerで有効にすることができます。
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
Swift 4で、@ objcを追加します。
viewDidLoadで:
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap)
関数:
@objc func dismissKeyboard() {
view.endEditing(true)
}
この拡張機能を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)
}
}
展開するにはEsqarrouthの答え、私はいつも、私はキーボードを却下していたから、クラスが場合は特に、キーボードを閉じ、次を使用していないview
プロパティを、および/またはのサブクラスではありませんUIView
。
UIApplication.shared.keyWindow?.endEditing(true)
そして、便宜上、UIApplcation
クラスへの次の拡張:
extension UIApplication {
/// Dismisses the keyboard from the key window of the
/// shared application instance.
///
/// - Parameters:
/// - force: specify `true` to force first responder to resign.
open class func endEditing(_ force: Bool = false) {
shared.endEditing(force)
}
/// Dismisses the keyboard from the key window of this
/// application instance.
///
/// - Parameters:
/// - force: specify `true` to force first responder to resign.
open func endEditing(_ force: Bool = false) {
keyWindow?.endEditing(force)
}
}
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)
}
}
初心者のプログラマーとして、人々がより熟練した不必要な応答を生成すると混乱する可能性があります...上記の複雑なことをする必要はありません!...
これが最も簡単なオプションです...キーボードがテキストフィールドに応答して表示される場合-タッチスクリーン関数の内部にresignFirstResponder関数を追加するだけです。以下に示すように、最初のレスポンダーが解放されたためにキーボードが閉じます(レスポンダーチェーンを終了します)...
override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
MyTextField.resignFirstResponder()
}
キーボードにIQKeyBoardManagerSwiftを使用しています。使い方は簡単です。ポッド「IQKeyboardManagerSwift」を追加するだけです
IQKeyboardManagerSwiftをインポートしてdidFinishLaunchingWithOptions
、でコードを記述しますAppDelegate
。
///add this line
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true
Swift3の場合
イベント認識機能をviewDidLoadに登録します。
let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))
次に、同じviewDidLoadのビューにジェスチャーを追加する必要があります。
self.view.addGestureRecognizer(tap)
次に、登録したメソッドを初期化する必要があります
func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
view.endEditing(true)
}
@ 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)
}
}
キーボードを辞任するために、タップジェスチャー認識機能を追加することもできます。: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")
}
override func viewDidLoad() {
super.viewDidLoad()
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))
}
func tap(sender: UITapGestureRecognizer){
print("tapped")
view.endEditing(true)
}
これを試してみてください
@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()
ファーストレスポンダーではないコントロールの呼び出しに問題がある場合、または現在のファーストレスポンダーを追跡するための簡単で保証されたバグのない方法がある場合は、ぜひお知らせください。