[iOS/Swift] 화면 터치 시 키보드 내리는 방법 / touchesBegan() / endEditing() / first responder
안녕하세요. 개발하는 정주입니다.
오늘은 화면 터치 시 키보드를 내리는 방법에 대해 포스팅하려고 합니다.
해당 포스팅에서는 화면의 빈 공간을 눌렀을 때 키보드가 내리는 방법에 대해 기술합니다. View를 눌렀을 때 등의 응용은 스스로 생각해보세요! 조금만 응용하면 가능합니다.
바로 시작합니다.
코드
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
코드 자체는 상당히 짧습니다. 하지만 모르는 것 투성이었습니다. 첫 번째로 touchesBegan()이 뭔지. endEditing()의 정확한 메서드 정의가 무엇인지 궁금했습니다.
하나하나씩 살펴보겠습니다.
touchesBegan()
공식 문서부터 보고 오겠습니다.
https://developer.apple.com/documentation/uikit/uiresponder/1621142-touchesbegan/
해당 문서에 나오는 touchesBegan()의 정의는 이렇습니다.
Tells this object that one or more new touches occurred in a view or window.
파파고의 힘을 빌려 번역한 내용은 이렇습니다.
뷰 또는 창에서 하나 이상의 새 터치가 발생했음을 이 개체에 알립니다.
즉, 화면에 터치가 시작될 때 해당 메서드가 호출이 된다는 것입니다. 터치에 관한 메서드는 이것 말고도 다양합니다.
각 메서드에 대해서 설명하면 포스팅이 너무 길어지니 추후 기회가 있다면 따로 다루겠습니다.
아무튼 touchesBegan()은 뷰나 화면에 터치가 시작될 때 호출되는 메서드라는 것을 알 수 있습니다.
저희가 하려는 "화면이 터치될 때"에 만족하는 메서드이죠. 따라서 해당 메서드가 기능 구현에 사용된 것입니다.
endEditing()
이 메서드도 공식 문서부터 보시죠.
https://developer.apple.com/documentation/uikit/uiview/1619630-endediting
endEditing()은 "Causes the view (or one of its embedded text fields) to resign the first responder status."라고 합니다.
이것만 보고는 이해하기가 쉽지 않습니다. 상세 내용의 마지막 줄을 보면 조금 더 이해가 쉽습니다. "If the force parameter is set to true, the text field is never even asked; it is forced to resign."라고 합니다. 파라미터로 true를 주면 first responder를 text field에게 묻지 않고 강제로 해제한다는 의미입니다.
즉, text field가 first responder일 때 키보드가 올라가 있고 이 상태를 강제로 해제함으로써 키보드를 내린다는 의미입니다.
조금 더 자세히 알아보겠습니다.
UITextField의 Delegate 중 textFieldShouldBeginEditing 메서드(https://developer.apple.com/documentation/uikit/uitextfielddelegate/1619601-textfieldshouldbeginediting)가 있습니다.
UITextField를 탭하면 내부적으로 textFieldShouldBeginEditing()를 호출하고 해당 메서드의 return이 true라면 탭한 UITextField가 first responder로 지정됩니다.
텍스트 필드가 first responder가 되면 UIKit은 텍스트 필드의 input view를 표시하려고 하고 이 input view가 바로 키보드(또는 입력을 받는 뷰)입니다. first responder가 해제되면 이 input view도 사라지게 되는 것이죠.
따라서 "키보드를 내린다."라는 것을 수행하기에 적절한 메서드라는 것이죠.
first responder
여기에서 first responder란 무엇인지에 대해 의문이 생깁니다. 하지만 서치를 해보니 생각보다 복잡한 개념이라는 것을 알게 되었습니다. 우유 사러 갔다가 양털 깎는 일은 자제하고 싶으므로 간단하게만 살펴보고 넘어가려고 합니다.
앱이 이벤트를 받으면 처음으로 이벤트를 받은 responder를 first responder라고 한다고 합니다.
자세한 내용은 아래 블로그에 잘 정리되어 있으니 아래에서 확인해주세요. 저도 나중에 제대로 공부해서 제식대로 포스팅 해보겠습니다.
https://jcsoohwancho.github.io/2019-07-25-Responder와-Responder-Chain,-그리고-First-Responder/
마무리 잡담
오늘은 키보드 내리기에서 사용되는 각종 메서드에 대해 알아보았습니다. 아쉽게도 first responder에 대해서는 제대로 못 알아봤지만 우유 사러 갔다가 양털 깎는 것은 최대한 자제하려고 하고 있기에 여기에서 마치도록 하겠습니다.
다음 기회에 따로 포스팅을 해보도록 하겠습니다.
감사합니다!
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.