🔥 구현할 기능 🔥
검색어 입력 중, 화면을 터치하거나 리턴키를 입력했을때 키보드를 내리기

❌ view.endEditing(true) ❌
그동안 TextField에 입력중인 상황에서, view.endEditing(true)를 호출하여 키보드를 내릴 수 있었다.
검색창 기능을 구현하던 중, 기존에 처리하던 방법대로
필요한 시점에view.endEditing(true)을 호출하면 키보드를 내릴 수 있을 줄 알았다,,
private lazy var searchBar: UISearchBar = {
let searchBar = UISearchBar()
searchBar.placeholder = "제목을 입력하세요."
searchBar.searchTextField.addTarget(
self,
action: #selector(didKeyboardReturnButtonTouched),
for: .editingDidEndOnExit
)
searchBar.delegate = self
return searchBar
}()
@IBAction func didBackgroundViewTouched(_ sender: UITapGestureRecognizer) {
view.endEditing(true)
}
@objc func didKeyboardReturnButtonTouched(_ sender: UITextField) {
view.endEditing(true)
}
화면을 터치했을때 view.endEditing을 호출하는 didBackgroundViewTouched,
키보드로 return 키를 탭했을때 view.endEditing을 호출하는 didKeyboardReturnButtonTouched
위 두 메서드를 호출했으나, 의도한대로 키보드가 내려가지 않았다.
원인?
view.endEditing()은 UIView의 메서드로,
뷰 계층 구조를 순회하며 현재 First Responder를 찾고
해당 First Responder의 키보드를 내리게 된다.
즉, 모든 서브뷰를 대상으로 키보드를 내리고자 할 때 사용하면 된다.
그럼 왜 view.endEditing(true)를 했음에도 내려가지 않았을까??
NavigationItem(NavigationBar)의 계층구조

NavigationItem(NavigationBar)은
ViewController rootView의 계층에 있지 않다.
따라서 view.endEditing을 했어도,
다른 계층에 있는 NavigationItem의 SearchBar는
Responder 해제되지 않아서
키보드가 내려가지 않는 것!
✅ 해결방법: resignFirstResponder ✅
searchBar에서 직접 resignFirstResponder()를 호출하며
원하는대로 키보드를 내릴 수 있었다.
private lazy var searchBar: UISearchBar = {
let searchBar = UISearchBar()
searchBar.placeholder = "제목을 입력하세요."
searchBar.searchTextField.addTarget(
self,
action: #selector(didKeyboardReturnButtonTouched),
for: .editingDidEndOnExit
)
searchBar.delegate = self
return searchBar
}()
@IBAction func didBackgroundViewTouched(_ sender: UITapGestureRecognizer) {
searchBar.resignFirstResponder()
}
@objc func didKeyboardReturnButtonTouched(_ sender: UITextField) {
searchBar.resignFirstResponder()
}
resignFirstResponder는 UIResponder의 메서드로,
해당 뷰가 First Responder일 경우, Responder를 해제하며 키보드를 내린다.
정리
1. endEditing과 resignFirstResponder
endEditing
1. UIView의 메서드
2. 뷰 계층 구조를 순회하며 First Responder를 찾아서 resign!
3. 모든 서브뷰를 순회하므로, 계층 내 First Responder를 알아서 찾아서 해제
resignFirstResponder
1. UIResponder의 메서드
2. 해당 뷰(Responder)가 First Responder일 경우 resign!
2. NavigationController의 계층 구조
Navigation Controller는 navigation stack에 viewControllers를 가지고 있음!
Navigation Bar는 네비게이션 컨트롤러가 관리하며,
Navigation Item을 통해 뷰 컨트롤러 각각의 네비게이션 바를 설정 할 수 있다.
한편 네비게이션 아이템에 넣어준 SearchBar는
네비게이션 바(네비게이션 컨트롤러) 계층에 속하며,
이는 뷰컨트롤러와는 독립적인 계층이다.
따라서 뷰컨트롤러의 rootView에서 endEditing을 호출해도,
SearchBar에는 아무런 영향이 없었다!
'트러블슈팅' 카테고리의 다른 글
UITextField secureTextEntry 설정시 키체인 영역 안나오게 하기 (0) | 2023.11.22 |
---|---|
CollectionView 페이징시 스크롤 멈춤현상 해결하기(feat. Activity Indicator, RefreshControl) (0) | 2023.09.24 |
다크모드와 CGColor(feat. layer.borderColor) (0) | 2023.07.26 |
🔥 구현할 기능 🔥
검색어 입력 중, 화면을 터치하거나 리턴키를 입력했을때 키보드를 내리기

❌ view.endEditing(true) ❌
그동안 TextField에 입력중인 상황에서, view.endEditing(true)를 호출하여 키보드를 내릴 수 있었다.
검색창 기능을 구현하던 중, 기존에 처리하던 방법대로
필요한 시점에view.endEditing(true)을 호출하면 키보드를 내릴 수 있을 줄 알았다,,
private lazy var searchBar: UISearchBar = {
let searchBar = UISearchBar()
searchBar.placeholder = "제목을 입력하세요."
searchBar.searchTextField.addTarget(
self,
action: #selector(didKeyboardReturnButtonTouched),
for: .editingDidEndOnExit
)
searchBar.delegate = self
return searchBar
}()
@IBAction func didBackgroundViewTouched(_ sender: UITapGestureRecognizer) {
view.endEditing(true)
}
@objc func didKeyboardReturnButtonTouched(_ sender: UITextField) {
view.endEditing(true)
}
화면을 터치했을때 view.endEditing을 호출하는 didBackgroundViewTouched,
키보드로 return 키를 탭했을때 view.endEditing을 호출하는 didKeyboardReturnButtonTouched
위 두 메서드를 호출했으나, 의도한대로 키보드가 내려가지 않았다.
원인?
view.endEditing()은 UIView의 메서드로,
뷰 계층 구조를 순회하며 현재 First Responder를 찾고
해당 First Responder의 키보드를 내리게 된다.
즉, 모든 서브뷰를 대상으로 키보드를 내리고자 할 때 사용하면 된다.
그럼 왜 view.endEditing(true)를 했음에도 내려가지 않았을까??
NavigationItem(NavigationBar)의 계층구조

NavigationItem(NavigationBar)은
ViewController rootView의 계층에 있지 않다.
따라서 view.endEditing을 했어도,
다른 계층에 있는 NavigationItem의 SearchBar는
Responder 해제되지 않아서
키보드가 내려가지 않는 것!
✅ 해결방법: resignFirstResponder ✅
searchBar에서 직접 resignFirstResponder()를 호출하며
원하는대로 키보드를 내릴 수 있었다.
private lazy var searchBar: UISearchBar = {
let searchBar = UISearchBar()
searchBar.placeholder = "제목을 입력하세요."
searchBar.searchTextField.addTarget(
self,
action: #selector(didKeyboardReturnButtonTouched),
for: .editingDidEndOnExit
)
searchBar.delegate = self
return searchBar
}()
@IBAction func didBackgroundViewTouched(_ sender: UITapGestureRecognizer) {
searchBar.resignFirstResponder()
}
@objc func didKeyboardReturnButtonTouched(_ sender: UITextField) {
searchBar.resignFirstResponder()
}
resignFirstResponder는 UIResponder의 메서드로,
해당 뷰가 First Responder일 경우, Responder를 해제하며 키보드를 내린다.
정리
1. endEditing과 resignFirstResponder
endEditing
1. UIView의 메서드
2. 뷰 계층 구조를 순회하며 First Responder를 찾아서 resign!
3. 모든 서브뷰를 순회하므로, 계층 내 First Responder를 알아서 찾아서 해제
resignFirstResponder
1. UIResponder의 메서드
2. 해당 뷰(Responder)가 First Responder일 경우 resign!
2. NavigationController의 계층 구조
Navigation Controller는 navigation stack에 viewControllers를 가지고 있음!
Navigation Bar는 네비게이션 컨트롤러가 관리하며,
Navigation Item을 통해 뷰 컨트롤러 각각의 네비게이션 바를 설정 할 수 있다.
한편 네비게이션 아이템에 넣어준 SearchBar는
네비게이션 바(네비게이션 컨트롤러) 계층에 속하며,
이는 뷰컨트롤러와는 독립적인 계층이다.
따라서 뷰컨트롤러의 rootView에서 endEditing을 호출해도,
SearchBar에는 아무런 영향이 없었다!
'트러블슈팅' 카테고리의 다른 글
UITextField secureTextEntry 설정시 키체인 영역 안나오게 하기 (0) | 2023.11.22 |
---|---|
CollectionView 페이징시 스크롤 멈춤현상 해결하기(feat. Activity Indicator, RefreshControl) (0) | 2023.09.24 |
다크모드와 CGColor(feat. layer.borderColor) (0) | 2023.07.26 |