EunHee-Jeong/TIL

화면 및 Return/Enter 키를 터치했을 때 키보드 처리 방법들

Closed this issue · 0 comments

상황

  • 사용자로부터 값을 입력 받은 후에, 키보드를 내려줄 때의 비동기적인 이벤트(배경화면 터치, Return 키를 누름 등) 처리

아이디어

  • Delegate 프로토콜을 사용한다.
  • 적용할 클래스가 UITextFieldDelegateUITextViewDelegate프로토콜을 채택하도록 하고, 해당 textField (또는 textView)의 Outlet 변수의 delegate를 지정하여 원하는 함수들을 사용하도록 한다.

1. 그동안 썼던 방법

i. 텍스트필드의 참조가 없거나 확실하지 않은 상황

  • 배경을 터치하면 키보드가 내려가도록 touchesBegan() 메서드를 오버라이드하여 사용하였다.

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            super.touchesBegan(touches, with: event)
                
            if let touch = touches.first, touch.view == self.view { view.endEditing(true) }
     }
    • 코드 설명

      • touch 객체의 정보들 중에서, 현재의 touch 이벤트(= touches.first )가 일어난 view (= touch.view )가 배경 view (= self.view )와 같은 지를 확인하고,

      • 같다면 편집을 끝낸다.

        • endEditing()

          • 최초 반응자를 사임해주는 메서드

          • view에 포함된 키보드를 사라지게 함

      • 주의사항 → 재정의하는 경우에는 특정 시점에서 super를 호출해야함

ii. 텍스트 필드의 참조가 있어 확실한 상황

  • return 키를 UITextFieldDelegate 프로토콜을 이용해 처리해주었다.

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            textField.resignFirstResponder() // 텍필 비활성화
            return true
    }
    • resignFirstResponder() 공식 문서

      → Notifies the receiver that it’s been asked to relinquish its status as first responder in its window.

      → window 객체에서 첫 번째 응답자로서의 상태를 포기하도록 요청 받았음을 해당 객체에 알림

      • 첫 번째 응답자(= first responder, 최초 반응자)란?

3. 새롭게 알게 된 방법

  • 엔터 키 (개행 문자) 를 눌렀을 때 textView의 활성화를 포기하는 요청을 보내서 키보드 내리기
    • 코드

      func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
              if text == "\n" {
                  textView.resignFirstResponder()
                  return false
              }
              return true
      }
    • 사용한 이유

      • textField 대신 textView를 이용해 입력창을 구현하던 중 알게 되었다.