버그 잡이

iOS - UIResponder, Responder Chain 알아보기 본문

IOS

iOS - UIResponder, Responder Chain 알아보기

버그잡이 2020. 10. 14. 11:02

 

UIResponder

 

UIResponder는 이벤트에 반응하고 이를 핸들링 할 수 있는 객체입니다.

위의 상속 구조를 보면 알 수 있듯이, UIView, UIViewController는 UIResponder를 상속하고 있습니다.

이벤트가 발생하면 UIKit은 리스폰더 객체에 이벤트를 넘깁니다.

 

특정 이벤트를 처리하기 위해서는 해당 이벤트에 대응하는 메서드들을 오버라이드하여 구현할 수 있습니다.

*toucheBegan(), touchedMoved(), touchedEnded(), touchedCancelled() 메서드가 있습니다.

class ViewController: UIViewController {

	override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
		print("touched")
	}
}

 

Responder Chain

 

responder 객체는 이벤트를 직접 처리하지않고 이벤트를 다른 객체에게 넘길 수 있습니다.

Responder Chain 에 따라 처리되지 않은 이벤트는 다른 responder 객체로 넘겨집니다.

위 사진처럼 미리 정해진 규칙에 따라 이벤트를 넘길 객체를 결정합니다.

 

 

Responder Chain을 관리하는 메서드들이 있습니다.

사용해봤던 메서드들이 있네요.

  • becomeFirstResponder()
  • resignFirstResponder()

위 메서드는 화면 진입시 키패드를 올리고 싶을때 사용할 수 있습니다.

왜냐면 UITextField 객체는 최초 리스폰더가 될 경우 키패드를 올립니다.

즉, 화면 진입시 textfield를 .becomeFirstResponder()로 설정하면 키패드가 올라오는 것입니다.

(원리를 모르고 사용했었는데, reponderChain을 활용한 메서드였네요.)

 

 

세 줄 요약

  1. responder 객체는 이벤트를 핸들링 할 수 있는 객체이다.
  2. reponder 객체는 이벤트를 처리하지 않고 다른 객체에 처리를 넘길 수 있는데 이 이동은 reponder chain 객체에 의해서 결정된다.
  3. 관련 메서드를 활용하면 responder chain을 관리할 수 있다. (ex_ 키패드 올리기)

 

 

*참고

https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/using_responders_and_the_responder_chain_to_handle_events

https://zeddios.tistory.com/538

 

 

반응형
Comments