본문 바로가기
Swift/UIKit

UIKit: Responder Chain

by songmoro 2025. 7. 13.
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의 인스턴스이고, 뷰/뷰 컨트롤러/앱 객체 자체가 아닌 경우에만 가능

 

UIResponder

  • UIKit 앱의 이벤트 처리 백본을 구성
    • 백본: 컴퓨터 네트워크 인프라의 일부
      • 서로 다른 네트워크를 서로 연결하고, 서로 다른 네트워크 간에 데이터 교환 경로 제공
  • 이벤트가 발생하면 UIKit은 처리를 위해 앱의 responder 객체로 이벤트를 디스패치
  • 특정 타입의 이벤트를 처리하려면 responder가 해당 메서드를 재정의
    • ex. 터치 이벤트 처리를 위해 touchesBegan(:with:), ... 구현
  • 이벤트를 처리하는 것 외에도 처리되지 않은 이벤트를 앱의 다른 부분으로 전달
    • 주어진 responder가 이벤트를 처리하지 않으면, 해당 이벤트를 responder chain의 다음 이벤트로 전달
    • UIKit은 미리 정의된 규칙을 통해 responder chain을 동적으로 관리
      • 예를 들어
        • 뷰는 슈퍼 뷰로 이벤트 전달
        • 루트 뷰는 뷰 컨트롤러로 이벤트 전달
  • responder는 UIEvent 객체를 처리하지만
    • inputView를 통해 사용자 지정 입력을 수락할 수 있음
      • 시스템 키보드가 inputView의 예
    • 사용자가 UITextField/UITextView 객체를 탭 -> 뷰가 첫 번째 responder가 되어 시스템 키보드인 입력 뷰를 표시

 

참고

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