Return 키를 누를 때 키보드를 숨기는 방법은 무엇입니까?


214

UITextfied텍스트 키보드를 클릭 하는 동안 사용 하고 있지만 return키를 누를 때 키보드가 사라지지 않습니다. 다음 코드를 사용했습니다.

func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore.
{
    return true;
}

resignfirstresponder 메소드가 작동하지 않습니다.


10
RSC 답변 수락을 고려 했습니까? 답을 받아들이는 것이이 장소를 작동시키는 좋은 방법으로 간주됩니다.
Juan Boero

7
답변이 요구 사항을 충족하는 경우 다른 사람이 도움을받을 수 있도록 답변으로 표시하십시오.
Syed Md. Kamruzzaman

답변:


397

다음 기능을 사용하여 앱이 키보드를 닫도록 할 수 있습니다

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true)
    return false
}

다음은이를 더 잘 설명하기위한 전체 예입니다.

//
//  ViewController.swift
//
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var myTextField : UITextField

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.myTextField.delegate = self
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }
}

코드 소스 : http://www.snip2code.com/Snippet/85930/swift-delegate-sample


22
"self.myTextField.delegate = self;"가 없습니다. 감사합니다!
tylerlindell

4
나는 빠졌다 UITextFieldDelegate!
Cesare

1
@kommradHomer, 의심 할 여지없이 키보드를 보이지 않게하는 다른 것이 있습니다. 원하는 경우 코드를 pastebin에 넣고 여기에 링크를 붙여 넣으십시오.
rsc

1
@ RSC 당신이 가장 옳았을 것입니다. 나는 ios에 대한 이틀의 초보자이기 때문에 어떻게 든 내 문제를 제거하고 모든 것이 제안한대로 작동했습니다 :)
kommradHomer

1
그래서 나 (빠른 3)에 대한 작업 : func textFieldShouldReturn(textField: UITextField) -> Bool {로 변경 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
바다 kg

112

이것의 return true일부는 텍스트 필드에 반환 허용 여부 만 알려줍니다.
키보드 (또는 첫 번째 응답자가 무엇이든)를 닫으려면 텍스트 필드에 수동으로 지시해야하며 이는 다음과 같이 수행됩니다 resignFirstResponder().

// Called on 'Return' pressed. Return false to ignore.

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

2
고마워 ... 내 경우에는 "resignFirstResponder ()"메서드가 자동으로 가져 오지 않고 지원하지 않고 수동으로 잘 작성하는 동안 생각했습니다. 감사합니다. 감사합니다.
Ashwinkumar Mangrulkar

@AshwinMangrulkar 베타 버전의 Xcode 6 자동 완성 기능에서 장애가 발생할 수 있습니다.
Paul Brewczynski

1
물론 "true"이후의 세미콜론은 더 이상 필요하지 않습니다.
36 By Design

1
viewController가 반드시 준수해야하는 것은 UITextFieldDelegate아닙니까?
Honey

1
self.view.endEditing () 대신이 답변이 적절하고 올바른 접근 방식입니다.
saigen

45
  • UITextFieldDelegate클래스 선언에 추가하십시오 .

    class ViewController: UIViewController, UITextFieldDelegate
  • textfield프로그래밍 방식으로 연결 또는 작성

    @IBOutlet weak var userText: UITextField!
  • 뷰에서 위임 된 텍스트 필드가로드 될 때 뷰 컨트롤러를 설정하십시오.

    override func viewDidLoad() {
    super.viewDidLoad()
    self.userText.delegate = self
    }
    
  • 다음 기능을 추가하십시오

    func textFieldShouldReturn(userText: UITextField!) -> Bool {
        userText.resignFirstResponder()
        return true;
    }
    

    이 모든 것을 사용하면 키보드는 텍스트 필드 외부를 터치하고 return 키를 눌러 해제합니다.


고마워요! 나는 이것을 놓쳤다 : UITextFieldDelegate... 감사합니다!
Adriano Tadao

어떤 이유로 txtField.delegate = self를 설정하면 앱을 실행 한 후에 해당 텍스트 필드에 입력 할 수 없습니다
Jesus Rodriguez

@JesusAdolfoRodriguez이 오류의 원인은이 코드가 문제를 일으키지 않는 이유가 있습니다. : D 행복한 코딩!
Codetard

단계별 감사합니다. 이것은 코드 블록보다 나에게 더 도움이되었습니다.
kenhkelly

1
"이 모든 것을 사용하면 텍스트 필드 외부를 터치하여 키보드가 사라지기 시작합니다."-사실이 아닙니다. textFieldShouldReturn은 리턴 버튼을 누를 때만 호출됩니다.
쥬라기

39

스위프트 4.2-델리게이트 불필요

UITextField에서 " 1 차 조치 트리거 "에 대한 조치 아울렛을 작성하고 전달 된 송신자 매개 변수에서 첫 번째 응답자를 사임 할 수 있습니다.

액션 아울렛 만들기

@IBAction func done(_ sender: UITextField) {
    sender.resignFirstResponder()
}

매우 간단합니다.

( https://youtu.be/v6GrnVQy7iA 에 대해 알려 주신 Scott Smith의 60 초 비디오에 감사드립니다 )


페이지에 여러 개의 텍스트 필드가있는 경우 각 텍스트 필드에 대해 텍스트 필드를 수행해야합니다.
DragonFire

@DragonFire 여러 개의 텍스트 필드를 동일한 콘센트에 할당 할 수 있습니다. 아웃렛 인스펙터 (화면 왼쪽)의 기본 액션 트리거 아웃렛에서 코드의 IBAction으로 드래그하기 만하면됩니다.
Brad Root

스토리 보드의 텍스트 필드에서 직접 드래그하면 기본 동작이 트리거되는 대신 링크 된 동작이 편집 완료 끝으로 기본 설정되므로 사이드 바의 Connections Inspector에서 수행해야합니다.
클라우드

놀랄 만한. 난 몰랐어. 감사.
Numan Karaaslan

여전히 관심이 있다면 Swift 2와 함께 작동합니다. 감사.
siralexsir88

22

Simple Swift 3 솔루션 :이 기능을 텍스트 필드가있는 뷰 컨트롤러에 추가하십시오.

@IBAction func textField(_ sender: AnyObject) {
    self.view.endEditing(true);
}

그런 다음 보조 편집기를 열고 Main.storyboard가보기의 한쪽에 있고 원하는 view controller.swift 파일이 다른쪽에 있는지 확인하십시오. 텍스트 필드를 클릭 한 다음 오른쪽 유틸리티 패널에서 '연결 관리자 표시'탭을 선택하십시오. '끝낼 때 끝'에서 빠른 파일의 위 기능으로 드래그를 제어하십시오. 해당 장면의 다른 텍스트 필드에 대해 반복하고 동일한 기능에 연결하십시오.


14

@RSC

나를 위해 Xcode 버전 6.2 (6C86e)의 중요한 추가 기능은 다음과 같습니다. override func viewDidLoad()

 self.input.delegate = self;

RSC 게시물을 찾을 때까지 몇 시간 동안 리턴 키를 사용하려고 시도했습니다. 감사합니다!

또한 화면의 다른 곳을 터치하면 키보드를 숨기려면 :

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        self.view.endEditing(true);
    }

12

자동 키보드 해제를 얻으려면이 코드를 사용자 정의 텍스트 필드 클래스의 메소드 중 하나에 넣습니다.

textField.addTarget(nil, action:"firstResponderAction:", forControlEvents:.EditingDidEndOnExit)

콘센트 이름을로 바꿉니다 textField.


1
훌륭해. 이것은 내 의견으로는 가장 짧고 가장 좋은 옵션입니다. 특히 다른 방법으로 텍스트 필드를 만들 때. 테이블 뷰 헤더 내부와 같습니다.
kakubei

죄송합니다.이 부분을 정확히 어디에 두어야하고 키보드를 닫으려면 어떻게해야합니까? 나는 mytextfield.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)(Swift 5 버전)을 넣었 viewDidLoad지만 텍스트 필드 바깥의 어딘가로 돌아가거나 두드리지 않았습니다. 콘센트를 각각 만들어서 텍스트 필드를 얻었습니다.
Neph

UIViewController에서 상속되는 사용자 정의 클래스의 하위 클래스에 넣었습니다. 하위 클래스는 UITextViewDelegate 및 UITextFieldDelegate도 준수합니다. 나는 viewDidAppear그 수업 의 방법에 넣었다 . UIAlertController.addTextField(configurationHandler: {(textField: UITextField!) in textField.delegate = self textField.addTarget(self, action: #selector(MySubclass.textChanged(_:)), for: .editingChanged) })이것은 내 경우에 비해 너무 구체적 일 수 있지만 도움이되기를 바랍니다. viewDidAppear필요한 경우 전화를 걸고 대리인을 따라 보십시오 .
peacetype 2016 년

10

스토리 보드를 주로 사용하고 여러 텍스트 필드를 쉽게 가질 수있는 다른 방법은 다음과 같습니다.

@IBAction func resignKeyboard(sender: AnyObject) {
    sender.resignFirstResponder()
}

해당보기 컨트롤러의 모든 텍스트 필드를 Did End On Exit각 필드 의 이벤트 에서 해당 조치에 연결하십시오 .


범프에 대해 죄송하지만 앱 에서이 방법을 시도하고 있는데 작동하지 않는 것 같습니다. 탐색 표시 줄에 텍스트 필드가 있으며 말한대로 해당 이벤트와 함께이 작업에 연결했지만 런타임에는 작동하지 않습니다.
wasimsandhu

발신자가 UIBarButtonItem 유형 인 경우 충돌이 발생합니다. 완료 버튼이있는 툴바를 숫자 키패드에 추가하면 인식 할 수없는 선택기가 인스턴스 로그로 전송되어 코드가 충돌합니다.
Jayprakash Dubey

8

RSC에서 클래스를 초기화하는 것이 좋습니다.

import Foundation
import UIKit

// Don't forget the delegate!
class ViewController: UIViewController, UITextFieldDelegate {

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

@IBOutlet var myTextField : UITextField?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.myTextField.delegate = self;
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    self.view.endEditing(true);
    return false;
}

}


8

사용자가 텍스트 키보드에서 완료 버튼을 누르면 종료 후 종료시 종료 이벤트가 생성됩니다. 이때 키보드가 사라지도록 텍스트 필드에 제어권을 포기하도록 지시해야합니다. 그러기 위해서는 컨트롤러 클래스에 액션 메소드를 추가해야합니다. ViewController.swift를 선택하여 다음 조치 메소드를 추가하십시오.

@IBAction func textFieldDoneEditing(sender: UITextField) {
sender.resignFirstResponder()}

프로젝트 네비게이터에서 Main.storyboard를 선택하고 연결 관리자를 불러옵니다. 종료시 종료 했음 옆에있는 원에서 스토리 보드의 노란색 View Controller 아이콘으로 끌어서 놓습니다. 방금 추가 한 단일 작업의 이름이 포함 된 작은 팝업 메뉴가 나타납니다. textFieldDoneEditing 조치를 클릭하여 선택하십시오.


8

다음은 peacetype의 설명에 대한 Swift 3.0 업데이트입니다.

textField.addTarget(nil, action:Selector(("firstResponderAction:")), for:.editingDidEndOnExit)

이것은 깨끗한 답변입니다
po5i

이것이 정답입니다. 한 번의 시도로 일했습니다.
Jaswant Singh

7

모든 UIViewController에 동일한 기능을 추가하는 것을 싫어합니다. UITextFieldDelegate를 지원하도록 UIViewController를 확장하면 "return press"의 기본 동작을 제공 할 수 있습니다.

extension UIViewController: UITextFieldDelegate{
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true;
    }
}

새 UIViewController 및 UITextField를 만들 때 UIViewController에 한 줄 코드를 작성하기 만하면됩니다.

override func viewDidLoad() {
    super.viewDidLoad()
    textField.delegate = self
}

Main.storyboard에 delegate를 연결하여이 한 줄 코드를 생략 할 수도 있습니다. ( "ctrl"을 사용하여 UITextField에서 UIViewController로 드래그)


5

스위프트 3

VC에 아래 코드를 추가하십시오

//hide keyboard when user tapps on return key on the keyboard
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    self.view.endEditing(true);
    return false;
}

나를 위해 작동


3

textField 델리게이트가 텍스트 필드 관련 코드를 작성하는 뷰 컨트롤러로 설정되어 있는지 확인하십시오.

self.textField.delegate = self

3

빠른

의 선택적 기능 사용 UITextFieldDelegate.

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    return textField.endEditing(false)
}

false이 필드는 사임을 요구할 수 있음을 의미합니다. true– 강제 사임.


3
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleScreenTap(sender:)))
    self.view.addGestureRecognizer(tap)}

그런 다음이 기능을 사용하십시오.

func handleScreenTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}

2

UIButton이 아닌 어디서나 넣을 수 있습니다.

 func TextFieldEndEditing(text fiend name: UITextField!) -> Bool
{
    return (false)
}

그런 다음이 코드를 버튼에 넣을 수 있습니다 (예 :).

self.view.endEditing(true)

이것은 나를 위해 일했다


2

사용중인 뷰 컨트롤러에서 :

//suppose you are using the textfield label as this

@IBOutlet weak var emailLabel: UITextField!
@IBOutlet weak var passwordLabel: UITextField!

//then your viewdidload should have the code like this
override func viewDidLoad() {
        super.viewDidLoad()

        self.emailLabel.delegate = self
        self.passwordLabel.delegate = self

    }

//then you should implement the func named textFieldShouldReturn
 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

// -- then, further if you want to close the keyboard when pressed somewhere else on the screen you can implement the following method too:

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

나는 funesBegan func을 좋아합니다, 신속한 4에서 작동합니다. 감사합니다.
AJ Hernandez


-1

모두 하나의 키보드 숨기기 및 키보드 열기에서보기 이동 : Swift 5

override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: self, action: #selector(taped))
    view.addGestureRecognizer(tap)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(KeyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}


   override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
 @objc func taped(){

    self.view.endEditing(true)

}

@objc func KeyboardWillShow(sender: NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y == 0{
        self.view.frame.origin.y -= keyboardSize.height
    }


}

@objc func KeyboardWillHide(sender : NSNotification){

    let keyboardSize : CGSize = ((sender.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size)!
    if self.view.frame.origin.y != 0{
        self.view.frame.origin.y += keyboardSize.height
    }

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.