programing

Swift를 사용하여 아무 곳이나 터치하여 iOS 키보드 닫기

kakaobank 2023. 5. 2. 22:54
반응형

Swift를 사용하여 아무 곳이나 터치하여 iOS 키보드 닫기

이것을 찾아 헤맸는데 찾을 수가 없네요.다음을 사용하여 키보드를 해제하는 방법을 알고 있습니다.Objective-C하지만 나는 그것을 어떻게 사용하는지 모릅니다.Swift아는 사람?

override func viewDidLoad() {
    super.viewDidLoad()
          
    //Looks for single or multiple taps. 
     let tap = UITapGestureRecognizer(target: self, action: #selector(UIInputViewController.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(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가 많이 포함된 my 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)
    }

}

( 정보의 출처).

Swift 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)
    }
}

모든 뷰 컨트롤러에서 항상 호출할 필요가 없도록 기본 뷰 컨트롤러를 호출하는 것이 가장 중요합니다.

전화할 수 있습니다.

resignFirstResponder()

UI 응답자의 인스턴스(예: UItextField).현재 키보드가 표시되는 원인이 되는 보기에서 호출하면 키보드가 해제됩니다.

swift 5 단 두 줄로 충분합니다.에 추가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)
}

RETURN 키를 누를 때 키보드를 숨기려는 경우

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}

그러나 두 번째 경우에는 모든 textFields에서 기본의 ViewController로 위임자를 전달해야 합니다.스토리보드

//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: 키보드를 제거하는 가장 쉬운 방법:

  //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
    }

신속하게 사용할 수 있습니다.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    view.endEditing(true)

}

코드 한 줄만 입력합니다.viewDidLoad()방법:

view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))

Dash의 대답은 정확하고 선호됩니다.에 그을린 은 더에불그린지구같다습니다접음과근은을법다▁is"같▁a니라고 부르는 것입니다.view.endEditing(true)이것이 원인입니다.view그리고 그것의 모든 개요.resignFirstResponder무시하고 싶은 뷰에 대한 참조가 없는 경우, 이것은 진부하지만 효과적인 해결책입니다.

개인적으로 저는 당신이 첫 번째 응답자를 사임하고 싶은 견해에 대한 참조가 있어야 한다고 생각합니다. .endEditing(force: Bool)야만적인 접근입니다. 사용하지 마십시오.

저는 @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 컨트롤러에서 이 동작을 사용할 수 있습니다.

override func viewDidLoad() {
    super.viewDidLoad()
    self.hideKeyboardWhenTappedAround() 
}

스토리보드:

  1. 테이블 보기를 선택합니다.
  2. 오른쪽에서 속성 검사자를 선택합니다.
  3. 키보드 섹션 - 원하는 해제 모드를 선택합니다.

스위프트 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
}

저는 키보드용으로 IQKeyBoardManagerSwift를 사용했습니다.사용하기 쉽습니다.포드 추가만'IQ 키보드 관리자Swift'

및 IQKeyboardManagerSwift에 didFinishLaunchingWithOptionsAppDelegate.

///add this line 
IQKeyboardManager.shared.shouldResignOnTouchOutside = true
IQKeyboardManager.shared.enable = true

Esqarrough의 답변을 확장하기 위해 키보드를 해제할 때 항상 다음을 사용합니다. 특히 키보드를 해제하는 클래스에 속성이 없거나 의 하위 클래스가 아닌 경우에는 더욱 그렇습니다.

UIApplication.shared.keyWindow?.endEditing(true)

편의상, 리고편의상, ▁to▁▁following다▁and니같▁the습ience,▁conven,,다음▁for.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)
    }

}

쉽게 해결할 수 있는 IQ 키보드 관리자를 사용하십시오.

/////////////////////////////////////////

![ 키보드를 비활성화하는 방법..][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스토리보드로

이 확장을 View 컨트롤러에 추가합니다.

  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)
  }
}

Swift 4에서 @objc를 추가합니다.

DidLoad 보기에서:

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 기능을 추가하면 됩니다.아래 그림과 같이 - 첫 번째 응답기가 해제되어(응답기 체인에서 나가기) 키보드가 닫힙니다...

override func touchesBegan(_: Set<UITouch>, with: UIEvent?){
    MyTextField.resignFirstResponder()
}

이 라이너 하나가 UI 보기의 모든 UI 텍스트 필드에서 키보드를 사임합니다.

self.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)
    }

}

스위프트3용

viewDidLoad에서 이벤트 인식자 등록

let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyBoard))

그런 다음 동일한 보기 DidLoad의 보기에 제스처를 추가해야 합니다.

self.view.addGestureRecognizer(tap)

그러면 등록된 방법을 초기화해야 합니다.

func hideKeyBoard(sender: UITapGestureRecognizer? = nil){
    view.endEditing(true)
}

다음은 Swift 5를 사용하여 다른 곳을 두 줄로 눌러 키보드를 해제하는 방법입니다.

(다른 대답을 덧붙이기는 싫지만, 이것이 구글에서 최고의 결과이기 때문에 저와 같은 신인들을 도울 것입니다.)

ViewController.swift에서 다음을 찾습니다.viewDidLoad()기능.

다음 두 줄을 추가합니다.

let tap: UIGestureRecognizer = UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing))
        
view.addGestureRecognizer(tap)

또한 탭 제스처 인식기를 추가하여 키보드를 다시 사용할 수 있습니다. :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)
}

제스처 인식기의 문제는 ViewCells 테이블에서 받고 싶은 모든 터치를 포착한다는 것이었습니다.

터치를 수신해야 하는 다른 보기가 있는 경우 설정해야 합니다.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)
}

사용해 보세요, 효과가 있습니다.

언급URL : https://stackoverflow.com/questions/24126678/close-ios-keyboard-by-touching-anywhere-using-swift

반응형