키보드를 Dismiss 하는 방식에는
// 방식 1
[textField].resignFirstResponder()
// 방식 2
self.view.endEditing(true)
두 가지가 있다. 하지만 기능적으로 아무런 차이도 없을까?
UITextFieldDelegate 의 resignFirstResponder() 메서드
resignFirstResponder() 메서드를 알아보기 전에 먼저 becomeFirstResponder 메서드를 알아보자.
하단 영상은 각 UITextFIeld 에서 Return 키를 누르면 다음 TextFIeld 로 시점이 옮겨지도록 구현한 View 이다.
becomeFirstResponder() 함수는 해당 윈도우에서 이 객체를 First Responder 로 만들 것을 요청하는 함수이다.
해당 객체가 첫번째 응답 responder 이면 true, 아니면 false 를 반환하는데, UITextView 나 UITextField 에서 키보드를 올리는 액션을 취하기 위해서는 becomeFirstResponder() 함수를 호출하면 된다.
resignFirstResponder() 함수는 해당 객체에게 지금 윈도우의 First Responer 로서의 상태를 포기하라고 요청이 왔음을 알리는 함수이다. 즉, 키보드가 내려가게 되는 것이다.
위 코드는 이를 구현한 코드이다.
extension AddWordViewController: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField == self.nameTextField {
meaningTextField.becomeFirstResponder()
} else if textField == self.meaningTextField {
synoymTextField.becomeFirstResponder()
} else if textField == self.synoymTextField {
exampleTextField.becomeFirstResponder()
} else {
exampleTextField.resignFirstResponder()
}
return true
}
}
self.view.endEditing
스토리보드에서 tapRecognizeGesture 를 추가한 후, IBAction 함수에서 endEditing 메서드를 통해 키보드를 내려가게 할 수 있다.
@IBAction func tapOtherSpace(_ sender: UITapGestureRecognizer) {
view.endEditing(true)
}
resignFirstResponder vs .endEditing
① resignFirstResponder()
resignFirstResponder 함수는 어떤 TextField가 First Responder 인지 명확히 알고, First Responder 의 상태를 resign 하고자할 때 언제든지 사용이 가능하다. 또한, TextField 에 키보드 사용 후 이를 내리고 바로 다음 Date Picker 로 이동해야하는 경우에도 사용이 가능하다.
② .endEditing()
.endEditing 함수는 어떤 일이 일어나던간에 키보드를 내려야 하는 순간 .endEditing 함수를 사용한다.
그리고, endEditing 은 하위 뷰의 전체 계층을 살펴보고, First Responder 가 해당 Status 를 Resign 하는지 확인하는 것이 중요하다.
이렇게 하면 First Responder 에 대한 명확한 Reference 가 이미 있는 경우 resignFirstResponder()를 호출하는 것보다 효율성이 떨어지지만, 그렇지 않은 경우에는 해당 View 를 찾고, Resign 하는 것 보다 더 쉽다.
' iOS > UIKit' 카테고리의 다른 글
IBOutlet Collection 은 왜 weak 수식어를 붙일 수 없을까? (3) | 2022.09.30 |
---|---|
CALayer 와 CAAnimation (0) | 2022.09.23 |
URLSession 을 활용하여 도시 날씨 데이터 가져오기 (1) | 2022.08.30 |
UICollectionView ContentView / UICollectionViewFlowLayout (0) | 2022.08.11 |
UITableView 를 활용한 ToDoList App 만들기 + Alert (0) | 2022.08.10 |