App에서 event란 터치와 같은 사용자의 인풋을 뜻한다.
예를 들면 네비게이션 버튼을 탭했을 때, 터치 자체가 이벤트가 되는 것이다.
이런 event 어떻게 수신하고 처리하는지에 대해 알아보자
프로그래밍 시 책임을 분리해서 작성하는 것이 기본이듯이, 이벤트 처리와 관련된 것은 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 부분에 전달되었다.
이벤트를 수신하고 처리하는 구조에 대해서 알아보았다. 그럼 터치 이벤트를 받는 view는 어떻게 알아낼 수 있는 것일까?
이것은 hitTest라는 함수를 통해 찾게 된다.
hitTest는 터치 이벤트가 발생한 최상단의 뷰를 찾는 함수이다.