나는 이것을 온통 찾고 있었지만 그것을 찾을 수없는 것 같습니다. 키보드를 사용하여 해제하는 방법을 알고 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의 표준 기능으로 포함되어 있으며이 기능과 같은 유용한 스위프트 확장 기능이 많이 포함되어 있습니다. 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)
}
}
모든 View Controller에서 항상 호출 할 필요가 없도록 Base View Controller에서 호출하는 것이 가장 중요합니다.
전화해도됩니다
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
}
}
스위프트 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에서 Main.Storyboard의 ViewController로 대리자를 전달해야합니다.
unrecognized selector sent to instance
이 코드를 얻는다 .
스위프트 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
}
신속한 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()
. 이것은 프로젝트의 상당히 오래된 코드베이스에서 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)
}
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()
}
스위프트 3
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)
}
}
탭 제스처 인식기를 추가하여 키보드를 사직 할 수도 있습니다. :디
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()
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()
첫 번째 응답자가 아닌 컨트롤을 호출하는 데 문제가 있거나 현재 첫 번째 응답자를 추적하는 쉽고 확실한 비버 기 방법이 있다면 그것에 대해 듣고 싶습니다!