728x90
앱을 통해 전파되는 이벤트를 처리하는 방법
- 앱은 responder 객체를 사용하여 이벤트를 수신/처리
- responder 객체는 UIResponder 클래스의 인스턴스
- 이벤트에 응답하고 처리하기 위한 추상적인 인터페이스
- UIView, UIViewController, UIApplication, ...
- responder는 raw 이벤트 데이터를 수신하고 이벤트를 처리 혹은 다른 responder 객체로 전달
- 앱이 이벤트를 수신하면
- UIKit은 해당 이벤트를 first responder라는 객체로 안내
- 처리되지 않은 이벤트는 active responder chain에서 responder -> responder로 전달
- active responder chain은 responder 객체의 dynamic configuration
- 이미지 설명
- 레이블, 텍스트 필드, 버튼, 2개의 백그라운드 뷰
- 다이어그램
- responder chain을 따라 이벤트가 이동하는 방법
- 설명
- 텍스트 필드가 이벤트를 처리하지 않으면
- UIKit은 이벤트를 텍스트 필드의 부모 UIView 객체로 디스패치
- 부모 UIView 객체에서 루트 UIView까지 이벤트를 디스패치
- responder chain은 이벤트를 window로 디스패치 하기 전에, 뷰 컨트롤러로 디스패치
- window가 이벤트를 처리하지 못하면
- UIKit은 이벤트를 UIApplication 객체에 디스패치
- UIApplication 객체가 UIResponder의 인스턴스이고, responder chain의 일부가 아닌 경우
- UIApplicationDelegate에 디스패치
- 텍스트 필드가 이벤트를 처리하지 않으면
first responder
- UIKit은 이벤트의 유형에 따라 이벤트에 대한 first responder 객체를 지정
- 이벤트 유형
- Touch events
- Press events
- Shake-motion events
- Remote-control events
- Editing menu messages
- 이벤트 유형
responder chain 변경
- responder 객체의 next 속성을 재정의하여 responder chain 변경 가능
- 다음 responder는 반환하는 객체가 됨
- 많은 UIKit 클래스는 이미 이 속성을 재정의하고, 특정 객체를 반환
- UIView
- 뷰가 뷰 컨트롤러의 루트 뷰인 경우, 다음 responder는 뷰 컨트롤러
- 루트 뷰가 아닌 경우, 다음 responder는 상위 뷰
- UIViewController
- 뷰 컨트롤러의 뷰가 window의 루트 뷰인 경우, 다음 responder는 window 객체
- 뷰 컨트롤러가 다른 뷰 컨트롤러에 의해 반환된 경우, 다음 responder는 뷰 컨트롤러
- UIWindow
- window의 다음 responder는 UIApplication 객체
- UIApplication
- 다음 responder는 app delegate
- app delegate가 UIResponder의 인스턴스이고, 뷰/뷰 컨트롤러/앱 객체 자체가 아닌 경우에만 가능
- 다음 responder는 app delegate
- UIView
UIResponder
- UIKit 앱의 이벤트 처리 백본을 구성
- 백본: 컴퓨터 네트워크 인프라의 일부
- 서로 다른 네트워크를 서로 연결하고, 서로 다른 네트워크 간에 데이터 교환 경로 제공
- 백본: 컴퓨터 네트워크 인프라의 일부
- 이벤트가 발생하면 UIKit은 처리를 위해 앱의 responder 객체로 이벤트를 디스패치
- 특정 타입의 이벤트를 처리하려면 responder가 해당 메서드를 재정의
- ex. 터치 이벤트 처리를 위해 touchesBegan(:with:), ... 구현
- 이벤트를 처리하는 것 외에도 처리되지 않은 이벤트를 앱의 다른 부분으로 전달
- 주어진 responder가 이벤트를 처리하지 않으면, 해당 이벤트를 responder chain의 다음 이벤트로 전달
- UIKit은 미리 정의된 규칙을 통해 responder chain을 동적으로 관리
- 예를 들어
- 뷰는 슈퍼 뷰로 이벤트 전달
- 루트 뷰는 뷰 컨트롤러로 이벤트 전달
- 예를 들어
- responder는 UIEvent 객체를 처리하지만
- inputView를 통해 사용자 지정 입력을 수락할 수 있음
- 시스템 키보드가 inputView의 예
- 사용자가 UITextField/UITextView 객체를 탭 -> 뷰가 첫 번째 responder가 되어 시스템 키보드인 입력 뷰를 표시
- inputView를 통해 사용자 지정 입력을 수락할 수 있음
참고
https://developer.apple.com/documentation/uikit/using-responders-and-the-responder-chain-to-handle-events
https://developer.apple.com/documentation/uikit/uiresponder
728x90
'Swift > UIKit' 카테고리의 다른 글
UIKit: clipsToBounds vs. masksToBounds (0) | 2025.07.20 |
---|---|
UIKit: 레이아웃 우선순위 (0) | 2025.07.20 |
UIKit: Nib, Xib (0) | 2025.07.13 |
UIKit: View, View Controller Lifecycle (0) | 2025.07.13 |
Storyboard UILabel Text 줄 바꿈 (0) | 2025.07.13 |