ฉันเฝ้ามองสิ่งนี้มาตลอด แต่ก็หาไม่เจอ ฉันรู้วิธียกเลิกการใช้แป้นพิมพ์Objective-C
แต่ฉันไม่รู้ว่าจะใช้งานSwift
อย่างไร มีใครรู้บ้าง
ฉันเฝ้ามองสิ่งนี้มาตลอด แต่ก็หาไม่เจอ ฉันรู้วิธียกเลิกการใช้แป้นพิมพ์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.
@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()
}
ฟังก์ชั่นนี้รวมอยู่ในฟังก์ชั่นมาตรฐานใน repo ของฉันซึ่งมีประโยชน์ต่อ Swift Extensions อย่างมากลองดู: https://github.com/goktugyil/EZSwiftExtensions
didSelectRowAtIndexPath
เพียงเตือนฉันจะขยายเป็นที่นี้สามารถยุ่งเกี่ยวกับ
tap.cancelsTouchesInView = false
เพียงเพิ่มไปยังส่วนขยายของคุณ: ที่แก้มันสำหรับฉันอย่างน้อย หวังว่านี่จะช่วยใคร
คำตอบสำหรับคำถามของคุณเกี่ยวกับวิธียกเลิกคีย์บอร์ดใน Xcode 6.1 โดยใช้ Swift ด้านล่าง:
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()
ใน Base view controller ของคุณ
//
// 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)
}
}
สิ่งที่สำคัญที่สุดในการเรียกใช้ใน Base View Controller ของคุณเพื่อที่จะได้ไม่ต้องโทรตลอดเวลาในคอนโทรลเลอร์มุมมอง
คุณสามารถโทร
resignFirstResponder()
ในอินสแตนซ์ใด ๆ ของ UIResponder เช่น UITextField หากคุณโทรไปที่มุมมองที่เป็นสาเหตุให้แป้นพิมพ์ปรากฏขึ้น
//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
}
แต่ในกรณีที่สองคุณจะต้องส่งผู้แทนจาก textFields ทั้งหมดไปยัง ViewController ใน Main.Storyboard
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
}
คำตอบของ Dash นั้นถูกต้องและเป็นที่ต้องการ อีกวิธีหนึ่งที่เรียกว่า "แผ่นดินที่ไหม้เกรียม"view.endEditing(true)
วิธีการคือการโทร สาเหตุนี้view
และ subviews resignFirstResponder
ทั้งหมดเพื่อ หากคุณไม่มีการอ้างอิงถึงมุมมองที่คุณต้องการยกเลิกนี่เป็นวิธีแก้ปัญหาที่แฮ็ก แต่มีประสิทธิภาพ
โปรดทราบว่าโดยส่วนตัวฉันคิดว่าคุณควรมีการอ้างอิงถึงมุมมองที่คุณต้องการลาออกก่อนที่จะตอบกลับ
.endEditing(force: Bool)
เป็นวิธีการป่าเถื่อน โปรดอย่าใช้มัน
swift 5เพียงแค่สองบรรทัดก็พอ เพิ่มลงในของคุณviewDidLoad
ควรทำงาน
let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tapGesture)
หากท่าทางการแตะของคุณบล็อกการสัมผัสอื่น ๆ ให้เพิ่มบรรทัดนี้:
tapGesture.cancelsTouchesInView = false
ในกระดานเรื่องราว:
สวิฟท์ 3:
ส่วนขยายที่มี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
}
ใช้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()
นี่เป็นเพราะใน codebase ของฉันค่อนข้างเก่ามีหลายครั้งที่dismissKeyboard()
ถูกใช้ไปแล้ว (ฉันจินตนาการว่านี่ไม่ใช่เรื่องแปลก) ที่ทำให้เกิดปัญหาคอมไพเลอร์
จากนั้นดังกล่าวข้างต้นพฤติกรรมนี้สามารถเปิดใช้งานในตัวควบคุมมุมมองแต่ละรายการ:
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
คุณสมบัติและ / หรือไม่ได้เป็น subclass 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)
}
}
ในฐานะโปรแกรมเมอร์มือใหม่อาจสร้างความสับสนได้เมื่อผู้คนให้คำตอบที่มีทักษะและไม่จำเป็นมากขึ้น ... คุณไม่จำเป็นต้องทำสิ่งที่ซับซ้อนตามที่แสดงด้านบน! ...
นี่คือตัวเลือกที่ง่าย ... ในกรณีที่แป้นพิมพ์ของคุณจะปรากฏในการตอบสนองต่อ TextField - การภายในฟังก์ชั่นหน้าจอสัมผัสของคุณเพียงแค่เพิ่มresignFirstResponderฟังก์ชั่น ดังที่แสดงด้านล่าง - แป้นพิมพ์จะปิดลงเนื่องจากการตอบกลับครั้งแรก (ออกจากเครือ Responder) ...
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
ซับในอันนี้ลาออกจากคีย์บอร์ดจาก UITextField ใน UIView
self.view.endEditing(true)
เพียงหนึ่งบรรทัดของรหัสในviewDidLoad()
วิธีการ:
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
รวดเร็วคุณสามารถใช้
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
view.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)
}
การโพสต์เป็นคำตอบใหม่เนื่องจากการแก้ไขคำตอบของ @ King-Wizard ของฉันถูกปฏิเสธ
ทำให้ชั้นเรียนของคุณเป็นตัวแทนของ UITextField และแทนที่ทับค่าเริ่มต้น
สวิฟต์ 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")
}
ความเป็นไปได้อีกอย่างหนึ่งก็คือเพิ่มปุ่มใหญ่โดยไม่มีเนื้อหาที่อยู่ใต้มุมมองทั้งหมดที่คุณอาจต้องแตะ ตั้งชื่อการกระทำ:
@IBAction func dismissKeyboardButton(sender: AnyObject) {
view.endEditing(true)
}
ปัญหาของตัวรู้จำท่าทางใช้งานสำหรับฉันซึ่งมันจับได้ทุกสัมผัสที่ฉันต้องการรับโดย tableViewCells
หากคุณมีมุมมองอื่นที่ควรได้รับการสัมผัสเช่นกันคุณต้องตั้งค่า
cancelsTouchesInView = false
แบบนี้:
let elsewhereTap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
elsewhereTap.cancelsTouchesInView = false
self.view.addGestureRecognizer(elsewhereTap)
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()
ในช่องข้อความทั้งหมดใน ViewController นี่คือตัวอย่างของการสร้างคอลเลกชันของฟิลด์ข้อความทั้งหมด (ซึ่งในกรณีของฉันจำเป็นสำหรับรหัสตรวจสอบ)
@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()
ใช้ตัวควบคุมที่ไม่ใช่คำตอบแรกหรือหากมีวิธีที่ไม่ต้องใช้บั๊กและง่าย ๆ ในการติดตามการตอบกลับครั้งแรกในปัจจุบันฉันชอบที่จะได้ยินเกี่ยวกับมัน!