Swift를 사용하여 어디서나 터치하여 iOS 키보드 닫기
나는 이것을 온통 찾고 있었지만 그것을 찾을 수없는 것 같습니다. 키보드를 사용하여 해제하는 방법을 알고 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
아래 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의 모든 인스턴스에서 현재 키보드가 표시되는 뷰에서 호출하면 키보드가 사라집니다.
스위프트 4 작동
아래와 같이 내선 번호를 만들고 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
}
}
스위프트 3의 경우 매우 간단합니다.
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
RETURN 키를 눌렀을 때 키보드를 숨기려면
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
그러나 두 번째 경우에는 모든 textField에서 Main.Storyboard의 ViewController로 대리자를 전달해야합니다.
스위프트 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)
야만적 인 접근이다; 사용하지 마십시오.
스토리 보드에서 :
- TableView를 선택하십시오
- 오른쪽에서 속성 관리자를 선택하십시오.
- 키보드 섹션에서-원하는 해제 모드를 선택하십시오
스위프트 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
}
! [키보드를 비활성화하는 방법 ..] [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)
}
}
스크롤보기를 사용하면 훨씬 간단 할 수 있습니다.
Dismiss interactively
스토리 보드에서 선택하십시오 .
Swift 4에서 @objc를 추가하십시오.
viewDidLoad에서 :
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap)
함수:
@objc func dismissKeyboard() {
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()
}
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()
}
특히 키보드를 닫는 클래스 에 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)
}
}
이 하나의 라이너는 UIView의 모든 UITextField에서 Keyboard를 사임합니다.
self.view.endEditing(true)
신속하게 사용할 수 있습니다
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
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)
}
}
키보드에 IQKeyBoardManagerSwift를 사용했습니다. 사용하기 쉽습니다. 포드 'IQKeyboardManagerSwift'를 추가하십시오.
가져 오기 IQKeyboardManagerSwift와의 쓰기 코드 didFinishLaunchingWithOptions
에서 AppDelegate
.
///add this line
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true
신속한 5 단 두 줄이면 충분합니다. 당신의 viewDidLoad
작품에 추가하십시오 .
let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tapGesture)
탭 제스처가 다른 터치를 차단 한 경우 다음 줄을 추가하십시오.
tapGesture.cancelsTouchesInView = false
스위프트 3
viewDidLoad에 이벤트 인식기를 등록하십시오.
let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))
그런 다음 동일한 viewDidLoad의 뷰에 제스처를 추가해야합니다.
self.view.addGestureRecognizer(tap)
그런 다음 등록 된 메소드를 초기화해야합니다
func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
view.endEditing(true)
}
또 다른 가능성은 터치해야 할 모든보기 아래에 내용이없는 큰 버튼을 추가하는 것입니다. 다음과 같은 조치를 취하십시오.
@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)
}
이것을 시도하십시오, 그것은 작동합니다
탭 제스처 인식기를 추가하여 키보드를 사직 할 수도 있습니다. :디
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")
}
보기에 둘 이상의 텍스트 필드가있는 경우
을 호출하지 않도록 @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()
첫 번째 응답자가 아닌 컨트롤을 호출하는 데 문제가 있거나 현재 첫 번째 응답자를 추적하는 쉽고 확실한 비버 기 방법이 있다면 그것에 대해 듣고 싶습니다!
나는 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)
}
나는이 하나의 라이너를 선호합니다 :
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "dismissKeyboardFromView:"))
UIViewController를 서브 클래 싱 한 UIViewController를 재정의 viewDidLoad 함수에 넣은 다음 프로젝트의 "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)
}
}
참고 URL : https://stackoverflow.com/questions/24126678/close-ios-keyboard-by-touching-anywhere-using-swift
'development' 카테고리의 다른 글
사용하지 않고 CSS에서 줄 바꿈하는 방법 (0) | 2020.02.27 |
---|---|
안드로이드에서 프로그래밍 방식으로 dp의 여백을 어떻게 설정합니까? (0) | 2020.02.27 |
Git 브랜칭 모델은 무엇입니까? (0) | 2020.02.27 |
두 개의 MySQL 데이터베이스 비교 (0) | 2020.02.27 |
JavaScript console.log가 오류를 발생시킵니다. "주 스레드에서 동기 XMLHttpRequest가 사용되지 않습니다…" (0) | 2020.02.27 |