Event Handling

Jisu·2023년 9월 7일
0

iOS

목록 보기
9/9

Event

App에서 event란 터치와 같은 사용자의 인풋을 뜻한다.
예를 들면 네비게이션 버튼을 탭했을 때, 터치 자체가 이벤트가 되는 것이다.

이런 event 어떻게 수신하고 처리하는지에 대해 알아보자

Responder Object

프로그래밍 시 책임을 분리해서 작성하는 것이 기본이듯이, 이벤트 처리와 관련된 것은 UIResponder 클래스가 관리한다.

UIKit으로 보자면 UIView, UIViewController 등이 이 UIResponder를 상속하기 때문에 UI측에서 이벤트를 처리할 수 있다.

앱은 수많은 UI Component로 이루어져있기때문에 어떤 UIResponder에 이벤트를 전달할지 찾아야한다. 그 과정을 responder chain이라고 부르며 그렇게 찾은 전달 대상을 first responder라고 부른다.
(공식 문서에서는 most appropriate라고 되어있는데, 정확한 source를 파악할 수 없는 경우도 있나보다.)

터치를 인식하고나면 그에 맞는 action이 필요한 경우가 있다. 버튼을 누르거나 네비게이션하는 상황이 대표적이다.

UIKit에서는 이를 target - action 구조로 풀고 있다.

    lazy var textField: UITextField = {
        $0.addTarget(self, action: #selector(textFieldTextDidChange), for: .editingChanged)
        return $0
    }(UITextField.makeBasicTextField(placeholder: placeholder))

UITextField 클래스는 이벤트를 수신받아 target으로 전달한다. 여기서는 상위 UIViewController가 이를 처리하기 때문에 self가 사용되었다.

action message를 받아서 호출될 함수가 action 부분에 전달되었다.

Event 발생 View 찾기

이벤트를 수신하고 처리하는 구조에 대해서 알아보았다. 그럼 터치 이벤트를 받는 view는 어떻게 알아낼 수 있는 것일까?
이것은 hitTest라는 함수를 통해 찾게 된다.

hitTest는 터치 이벤트가 발생한 최상단의 뷰를 찾는 함수이다.

프로세스 요약

  1. 유저가 특정 위치를 터치한다.
  2. UIView 내의 hitTest 함수를 통해 터치된 곳에서 가장 상위에 있는 View를 찾는다.
  3. 터치이벤트를 받은 View가 결정되면 responder chain을 통해서 이벤트를 처리할 수 있는 객체를 찾는다.
  4. 이벤트를 처리한다.

Reference

Using responders and the responder chain to handle events

hitTest관련 블로그글

responder chain

profile
비즈니스에 관심많은 DevOps Engineer 장지수입니다.

0개의 댓글