私はずっとこれを探していましたが、私はそれを見つけることができないようです。私はObjective-C
を使ってキーボードを消す方法を知っていますが、Swift
を使ってキーボードを消す方法がわかりませんか?誰か知っている?
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
下記の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)
}
}
( この情報の出所 )。
あなたは呼び出すことができます
resignFirstResponder()
uITextFieldなどのUIResponderの任意のインスタンスで。現在キーボードが表示されているビューでそれを呼び出すと、キーボードは消えます。
以下のように拡張子を作成し、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)
}
}
//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)
}
戻るキーを押したときにキーボードを隠したい場合
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
しかし2番目のケースでは、Main.StoryboardのすべてのtextFieldからViewControllerにデリゲートを渡す必要もあります。
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
}
ダッシュの答えは正解であり好ましいです。もっと "焦土"のアプローチはview.endEditing(true)
を呼び出すことです。これはview
とそのすべてのサブビューをresignFirstResponder
にします。却下したいビューへの参照がない場合、これはハッキーだが効果的な解決策です。
個人的には、私はあなたがあなたが最初のレスポンダーを辞任させたいのだという意見への参照を持つべきだと思います。
.endEditing(force: Bool)
は野蛮なアプローチです。使わないでください。
絵コンテでは:
スイフト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
}
![キーボードを無効にする方法] [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)
}
}
Swift 4では、@ objcを追加します。
ViewDidLoadでは、
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap)
関数:
@objc func dismissKeyboard() {
view.endEditing(true)
}
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 機能を追加するだけです。以下に示すように - First Responderが解放された(Responderチェーンから出る)ためにキーボードが閉じます...
override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
MyTextField.resignFirstResponder()
}
私は最善の解決策がいくつかの調整を加えた@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()
}
この拡張子を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)
}
}
この1つのライナーは、UIView内のすべての(任意の)UITextFieldからキーボードを辞任します。
self.view.endEditing(true)
Swiftではあなたが使うことができます
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
キーボードにはIQKeyBoardManagerSwiftを使っています。使い方は簡単です。ポッドに 'IQKeyboardManagerSwift'を追加するだけです。
IQKeyboardManagerSwiftをインポートし、didFinishLaunchingWithOptions
のAppDelegate
にコードを書き込みます。
///add this line
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true
私はいつも以下を使います。
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)
を呼び出すことができます。
Swift3の場合
ViewDidLoadにイベントレコグナイザーを登録する
let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))
それから、同じviewDidLoadのビューにジェスチャを追加する必要があります。
self.view.addGestureRecognizer(tap)
それから登録されたメソッドを初期化する必要があります
func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
view.endEditing(true)
}
他にもタッチを受け取るべきビューがある場合は、cancelsTouchesInView = false
を設定する必要があります
このような:
let elsewhereTap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
elsewhereTap.cancelsTouchesInView = false
self.view.addGestureRecognizer(elsewhereTap)
もう1つの可能性は、あなたが触れる必要があるかもしれないすべてのビューの下に横たわっているコンテンツのない大きなボタンを単に追加することです。次のような名前を付けます。
@IBAction func dismissKeyboardButton(sender: AnyObject) {
view.endEditing(true)
}
ジェスチャーレコグナイザーの問題は私にはありました、それはまた私がtableViewCellsによって受けたがっていたすべての接触をつかまえたということでした。
override func viewDidLoad() {
super.viewDidLoad()
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))
}
func tap(sender: UITapGestureRecognizer){
print("tapped")
view.endEditing(true)
}
これを試して、それは働いています
私はあなたに有名になりました
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*/
}
私は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)
}
viewDidLoad()
メソッドの1行のコード:
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
@ 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()
を呼び出すことに問題がある場合、または現在のファーストレスポンダを追跡するための簡単で保証されたバグのない方法がある場合は、それについて知りたいです。
これを簡潔に行う方法は次のとおりです。
let endEditingTapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:)))
endEditingTapGesture.cancelsTouchesInView = false
view.addGestureRecognizer(endEditingTapGesture)
私はこれを好む ワンライナー :
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)
}
}
キーボードを辞任するためにタップジェスチャー認識機能を追加することもできます。 :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.あなたの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!
}
}
Swift 5 たった2行で十分です。 viewDidLoad
を追加すればうまくいくはずです。
let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tapGesture)
タップジェスチャで他のタッチがブロックされている場合は、次の行を追加してください。
tapGesture.cancelsTouchesInView = false
スイフト3
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
Swift4 + RxSwiftの例(RxGestureもインポート)
view.rx.tapGesture()
.when(GestureRecognizerState.recognized)
.subscribe({ _ in
self.view.endEditing(true)
})
.disposed(by: disposeBag)
私の@ 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)
}
}