UIResponder(feat.becomeFirstResponder)
- Textfield를 사용할 때 많이 쓰는 메소드인 becomeFirstResponder에대해서 공부를 하다가 UIResponder 에대해 더 깊게 공부해보자는 생각이 들었다.
UIResponder란?
- UIResponder객체는 UIkit 앱 이벤트 처리 백본을 구성한다.
- 앱 이벤트 → ex) 화면 터치
- UIApplication객체, UIViewController객체 및 모든 UIView객체(UIWindow포함) 모두 다 리스폰더 객체이다.
- 리스폰터는 UIKit이 제공하는 이벤트 정보를 사용하여서 터치 이벤트의 변경 사항을 추적하고, 앱의 인터페이스를 적절하게 업데이트한다.
Responder Chain
- 리스폰더 객체들이 동적으로 구성된 이벤트 전달 체인이다.
- 리스폰더가 이벤트를 받았다면 리스폰더는 반드시 그것을 처리하거나, 다른 리스폰더 오브젝트로 넘겨주어야 한다. ⇒ Responder Chain
- First Responder ⇒ 이벤트를 처리하기에 가장 적절한 리스폰더 객체
- 아래의 그림과 같이 화살표를 따라서 리스폰더 체인이 구성된다.
- ex) Texfield가 이벤트를 처리하지않으면, 슈퍼 뷰인 UIView로 이벤트가 전달이된다.
🧐 becomFirstResponder
- UITextField에서 키보드는 객체가 최초 리스폰더일 경우에 나타난다.
- becomFirstResponder를 활용하여 키보드를 띄울 수 있다.
- 반대로, resignFirstResponder를 활용하여 키보드를 내릴 수 있다.
🧐 resignFirstResponder() VS endEditing(_:)
- resignFirstResponder()
💡 Notifies this object that it has been asked to relinquish its status as first responder in its window.
- endEditing(_:)
💡 Causes the view (or one of its embedded text fields) to resign the first responder status.
👀 두 개의 차이점은 무엇일까?
someTextField.resignFirstResponder()
resignFirstResponder() is good to use any time you know exactly which text field is the first responder and you want to resign its first responder status. This can be slightly more efficient then the alternative, but if you're doing something such as creating a custom control, this can make plenty of sense. Perhaps you have a text field, and when the "Next" button is pressed, you want to get rid of the keyboard and present a date picker, for example. Here, I would definitely use resignFirstResponder()
→ Specific하게 textfield의 키보드를 내릴 수 있다.(세세한 조정이 가능!)
self.view.endEditing(true)
I typically reserve this for scenarios when I just absolutely need to clear the keyboard no matter what is currently going on, for whatever reason. Perhaps, I've got a slide-over menu? Just before this slides out, no matter what is going on, the keyboard should go away, so I'll make sure everything resigns its first responder status. It's important to note that endEditing() will look through the entire hierarchy of subviews and make sure whatever is the first responder resigns its status. This makes it less efficient then calling resignFirstResponder() if you already have a concrete reference to the first responder, but if not, it's easier than finding that view and having it resign.
→ 지금 무엇을 하든, 어떤 것을 할 예정이든, 그냥 싹 다 중지하고 키보드를 내려버린다!
view.endEditing(true) 의 예시
- 키보드 외에 화면을 터치하면 키보드가 내려가는 코드!
extension AddContactViewController: UITextFieldDelegate {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
📚 참고
[iOS] 리스폰더 체인 (Responder Chain) 이란? (feat. UIResponder, First Responder, UIEvent)
'iOS' 카테고리의 다른 글
[iOS] sizeToFit()과 ToolBar (0) | 2023.02.09 |
---|---|
[iOS] Target-Action Pattern (0) | 2023.02.06 |
[iOS] CGPoint, CGSize, CGRect (0) | 2023.02.06 |
[iOS] TextField 왼쪽 여백 넣기 (0) | 2023.02.06 |
[iOS] File System (0) | 2023.02.04 |