study record

[iOS] UIResponder 본문

iOS/iOS 정리

[iOS] UIResponder

asong 2022. 3. 30. 17:21

Responder 

Responder는 이벤트를 핸들링하고 이벤트에 반응할 수 있는 객체이다. 모든 responder 객체UIResponder에서 상속된 클래스들의 인스턴스이다. 이 클래스는 이벤트 핸들링을 위한 인터페이스와 responder들의 기본적인 행위를 정의한다. 

 

UIApplication, UIViewController 객체들, 모든 UIView 객체들을 포함한 많은 주요 객체들 또한 responder이다. 이벤트가 일어나면, UIKit는 이벤트 핸들링을 위해 해당 이벤트를 앱의 responder 객체들에게 보낸다.

이벤트의 종류엔 터치 이벤트, 모션 이벤트 등이 있다. 특정 이벤트를 핸들링하기 위해서는 responder가 해당 이벤트에 대응되는 메서드들을 오버라이드하여 구현해야 한다. 예시로, 터치 이벤트를 핸들링하기 위해서는 responder가 touchesBegan(_:with:) 등의 메서드를 구현해야 한다. 터치의 경우에, responder는 터치의 변화를 트래킹하고 앱의 인터페이스를 적절히 업데이트하기 위해서 UIKit에서 제공하는 이벤트 정보를 이용한다.

 

Responder들은 UIEvent 객체를 처리할 수도 있고, input View를 통해 커스텀 Input을 받아들일 수도 있다. 시스템 키보드가 input view에 대한 예시이다. 사용자가 화면의 UITextField를 탭하면 해당 뷰는 first responder가 되고, input view를 디스플레이한다. 이 경우의 input view는 시스템 키보드이다. 

 

Responder Chain

이벤트 핸들링 말고도, UIKit responder들은 처리되지 않은 이벤트를 앱의 다른 파트로 forwarding하는 일도 담당한다. Responder Chain은 responder 객체들이 이벤트나 액션 메시지를 핸들링할 책임을 앱의 다른 객체들에게 전송할 수 있도록 해준다. 특정 정해진 responder가 이벤트를 핸들링하지 않을 경우, 해당 responder는 그 이벤트를 responder chain의 다음 객체에게로 포워딩한다. 메시지는 처리될 때까지 계속 chain의 상위 객체들로 이동한다. 마지막까지 처리되지 않을 경우, 앱이 해당 메시지를 버린다.

 

 

일반적인 이벤트는 responder chain에서 뷰(first responder 또는 터치된 뷰)에서 시작해서 뷰 계층을 따라 window객체를 거쳐 app 객체에 도달할 때까지 이동한다. UIKit는 일정한 규칙을 사용하여 responder chain을 동적으로 관리하는데, 이 규칙에 의해 어떤 객체가 다음 순서로 이벤트를 받을지가 결정된다. 예시로, 뷰는 뷰의 슈퍼뷰에게로 이벤트를 전달하고, 뷰 계층의 루트 뷰는 루트 뷰의 뷰 컨트롤러에게로 이벤트를 포워딩한다.

 

textField가 이벤트 핸들링하지 않으면 textField의 부모인 UIView 객체에게로 이벤트를 보내고, 윈도우의 루트 뷰에게로 보낸다.

루트 뷰에서 Responder Chain은 이벤트를 윈도우로 보내기 전에 방향을 바꾸어 루트 뷰를 소유하고 있는 뷰컨트롤러에게 보낸다.

만약 윈도우가 이벤트를 처리하지 못하면, UIKit는 이벤트를 UIApplication 객체에게로 보낸다. 그리고 app delegate가 UIResponder의 인스턴스이고, responder chain의 일부가 아니라면 이벤트를 app delegate로 보낸다.

UIView -> UIViewController -> UIWindow -> UIApplication -> AppDelegate 순서로 이벤트가 전달.

 

First Responder

앱에서 많은 종류의 이벤트들을 처음으로 받는 responder 객체를 first responder라고 한다. first responder는 대체로 앱이 이벤트를 핸들링하기 가장 적합하다고 간주하는 responder 객체이다. 앱이 이벤트를 받으면 UIKit가 해당 이벤트를 가장 적합한 responder 객체인 first responder에게 보낸다.

 

이벤트를 받기 위해서는 responder가 자신이 first responder가 될 수 있음을 나타내야 한다. first responder 되기 위해서는, UIResponder의 서브 클래스에서 canBecomeFirstResponder 프로퍼티를 오버라이드하여 true를 리턴하도록 해야 한다.

 

이벤트메시지를 받는 것 이외에 responder는 target이 특정되지 않은 액션 메시지들을 받을 수 있다.

 

becomeFirstResponder(), ResignFirstResponder()

becomeFirstResponder()해당 윈도우에서 객체를 first responder로 만들 것을 요청하는 함수이다.

resignFirstResponder()해당 객체에게 지금 윈도우의 첫 번째 responder로서의 상태를 포기하라고 요청이 왔음을 알리는 함수이다.

 

 

참고:

https://seizze.github.io/2019/11/26/iOS%EC%9D%98-Responder%EC%99%80-Responder-Chain-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0.html

 

 

 

 

'iOS > iOS 정리' 카테고리의 다른 글

[iOS] invalidateIntrinsicContentSize()  (0) 2022.04.05
[iOS] UIView의 Layer란?  (0) 2022.04.01
[iOS] NSCache란?  (0) 2022.03.26
iOS App 실행 과정  (0) 2022.03.25
[iOS] View의 생명주기  (0) 2022.03.23