티스토리 뷰

iOS 개발/iOS

UIResponder

beankhan 2016. 7. 24. 14:19

UIKit에 포함된 모든 객체는 NSObject를 상속받는다. 그리고 모든 UIView는 UIResponder 클래스를 상속받는다. UIResponder는 사용자 인터페이스에서 가장 중요한 역할을 하는 클래스다.

기본메소드
• touchesBegan:withEvent: - 화면을 터치하기 시작할 때 호출되는 메서드
• touchesMoved:withEvent: - 터치한 후 손가락을 이동시킬 때 호출되는 메서드
• touchesEnded:withEvent: - 손가락을 뗀 경우 호출되는 메서드
• touchesCancelled:withEvent: - 시스템 에러 상황 때문에 멀티 터치 동작이 취 소된 경우 호출되는 메서드. 손가락을 여섯 개 이상 터치해도 취소로 간주된다.

다음은 아이폰 OS 3.0에서 새롭게 추가된 메서드다.
• motionBegan:withEvent: - 터치 외에 아이폰을 움직이거나 흔드는 동작을 시 작할 때 호출된다.
• motionEnded:withEvent: - 움직임이 끝났을 때 호출되는 메서드
• motionCancelled:withEvent: - 시스템 상황 때문에 움직임이 취소되는 경우 호출되는데, 아이폰을 너무 오래 흔드는 경우도 취소로 간주된다.
• undoManager 속성 - 실행 취소(Undo), 실행 복귀(Redo)를 관리하는 NSUndo Manager 객체를 참조할 수 있다.
• canPerformAction:withSender: - 아이폰 3.0부터는 베껴두기, 오려두기, 붙이 기, 선택, 전체 선택(Copy/Paste/Select/Select All) 등의 동작을 구현하기 위해 메뉴를 도입했다. 메뉴를 화면에 보이기 전에 해당 동작을 수행할 수 있는지 여부를 묻고, 가능한 메뉴만 화면에 보여준다. 이 메서드를 재정의하면 원하 는 메뉴만 보이게 할 수 있다.


UIResponder 체인 메소드
UIResponder 응답 체인 관련 메서드를 살펴보자. UIView가 자식, 부모 관계로 맺어 지듯 UIResponder도 그 관계를 그대로 응답 체인으로 유지한다. 응답 체인은 이벤트를 처리할 대상을 찾기 위해서 사용된다. 다음은 UIResponder의 주요 메서드다.
• nextResponder - UIResponder 체인의 상위 객체를 리턴한다. 상위 객체가 없 으면 nil을 리턴한다.
• isFirstResponder - 객체가 현재 최초 응답 객체인지를 알려준다.
• canBecomeFirstResponder - 객체를 최초 응답 객체로 만들 수 있는지 여부를 리턴한다. 기본값으로 NO를 리턴하기 때문에, 최초 응답 객체가 될 수 있다 면 이 메서드를 재정의해서 YES를 리턴해야 한다.
• canResignFirstResponder - 최초 응답 객체에서 벗어날 수 있는지 여부를 리턴 한다. YES를 리턴하면 최초 응답 객체를 벗어나려고 할 때 실제로 벗어난다.
• becomeFirstResponder - 객체를 최초 응답 객체로 만든다. canBecomeFirst Responder가 YES를 리턴하고 기존의 최초 응답 객체가 canResigmFirst Responder에서 YES를 리턴하는 경우에 가능하다.
• resignFirstResponder - 최초 응답 객체에서 벗어나게 한다. 4장에서 키보드를 숨기는 데 사용했던 메서드다. 키보드는 텍스트 입력을 받는 객체가 최초 응 답 객체가 될 경우에 나타나고, 다른 객체가 최초 응답 객체가 되면 사라진다.


이벤트 흐름
 아이폰 OS에서 이벤트는 UIResponder를 따라서 여행한다. UIResponder는 체인 형식으로 구성되어 있어서 최초 응답 객체로 전달된 이벤트는 더 깊은 곳으로 계 속 흘러 내려간다. 아이폰 OS에서 최종단까지의 이벤트 흐름은 그림 6-4와 같다.




1. 사용자가 손가락으로 화면을 누르면 아이폰 OS의 디바이스 드라이버는 이 동작을 UIEvent로 변환해서 실행 중인 애플리케이션 객체인 UIApplication의 sendEvent 메서드를 호출한다.
2. UIApplication의 sendEvent 메서드는 UIWindow에게 sendEvent를 다시 보낸다.
3. UIWindow는 이벤트에 해당하는 메시지를 자식 뷰 중에서 최초 응답 객체에게 보낸다.  
4. 최초 응답 객체가 이벤트를 처리하고 이벤트는 소멸된다. 이 순서가 이벤트가 처리되는 방식이다.

만약 최초 응답 객체가 touchesBegan 을 처리하지 못한다면 UIEvent는 처리될 때까지 UIResponder 체인을 타고 여행을 계속한다. 점선 화살표는 끝까지 처리되지 않을 때의 흐름을 보여준다.

1. 최초 응답 객체(거의 UIView다)에 뷰 컨트롤러가 있는 경우 뷰 컨트롤러에 touchesBegan 메시지를 보냄.
2. 뷰 컨트롤러도 이벤트를 처리하지 않는다면 부모 뷰에 메시지를 보냄.
3. 부모 뷰도 touchesBegan을 처리하지 않으면 다시 2번부터 반복하다가 결국 UIWindow 객체까지 touchesBegan 메시지를 보냄.
4. UIWindow는 UIApplication 객체로 메시지를 보냄.
5. UIApplication에서도 메시지를 처리하지 않으면 메시지를 버림.

이제 응답 체인이 무엇인지 이해했을 것이다. 응답 체인의 장점은 관심 있는 이 벤트만 처리하고, 관심 없는 이벤트는 다음 응답 객체로 책임을 미룰 수 있다는 점 이다.



'iOS 개발 > iOS' 카테고리의 다른 글

iPhone 초기화, Simulator Path, Sandbox 추출  (0) 2016.07.24
UIView LifeCycle  (0) 2016.07.24
ViewController LifeCycle  (0) 2016.07.24
Application LifeCycle  (0) 2016.07.24
int, NSInteger, NSNumber의 차이  (0) 2016.07.24
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함