2009-10-19 7 views
13

호기심과 마찬가지로 UIView 클래스의 nextResponder 메서드 구현에서 뷰를 관리하는 UIViewController가 누구인지 어떻게 알 수 있습니까? UIResponder 문서에 설명되어 있으며 제대로 작동하는지는 알 수 있지만 이해가되지 않습니다. 내가 아는 한, UIView는 컨트롤러에 대한 참조를 유지하지 않으므로 뒤에서 무슨 일이 일어나고 있는가? 또는 나는 다만 명백한 무언가를 놓치고 있는가?UIView nextResponder는 UIViewController가 무엇인지 어떻게 알 수 있습니까?

아직 Objective-C 및 iPhone 개발에 익숙하지 않으므로 사과하니 매우 분명한 생각이 들지만 매우 궁금합니다.

감사합니다.

답변

7

responder chain은보기 계층 구조와 별개입니다. 리스폰 더 체인은 다음과 같을 수 있습니다.

First Responder > View Hierarchy > Window > Window Delegate > etc... 

그러나 객체는 응답기 체인에 삽입 할 수 있으며 UIViewController가 수행합니다. 문서에서 :

보기 컨트롤러는 자신이 관리하는보기에 밀접하게 연결되어 있기 때문에 이벤트를 처리하는 데 사용되는 응답기 체인의 일부이기도합니다. 뷰 컨트롤러는 그 자체로 UIResponder 클래스의 자손이며 관리 뷰와 슈퍼 뷰 사이의 응답 체인에 삽입됩니다.

큰 코코아에서는 -setNextResponder : 메소드를 사용하여 수행합니다. 이 메소드는 Cocoa Touch에서는 공개되지 않지만 UIViewController가하는 것처럼 보입니다.

0

내 생각 엔 시스템이 UIViewController 개체와 해당 루트 UIView 개체 간의 매핑을 유지 관리 할 수 ​​있습니다. 응답 체인의 순회 코드는이 매핑을 사용하여 해당 UIViewController 객체에 이벤트를 전달할 수 있습니다.

일반적 파단하여 추가된다 :

하위 뷰 =의 ViewController보기]

[수퍼의 addSubview의 하위 뷰]

addSubview 방법은 자동이므로, 하위 뷰의 다음 응답으로 수퍼을 설정

a) viewController는 superview와 subview 사이에 자신을 삽입 할 기회가 없습니다.

b) viewController는 수퍼 뷰에 대해 알지 못하므로 다음 응답자로 설정할 수 없습니다.

c)보기가 컨트롤러간에 공유되지 않을 것을 권장합니다. 멀티 스레딩이 없으면 뷰와 뷰 컨트롤러의 맵이있는 경우에만이 제한이 적용됩니다.

2

UIView.h를 보면 UIViewController * 유형의 _viewDelegate라는 멤버 변수를 볼 수 있습니다.이 뷰 컨트롤러의 view 속성이 설정되어있을 때 뷰 컨트롤러 참조가 저장되어있는 곳일 수 있습니다. nextResponder를 호출 할 때 봐라.

1

실제 uiview에 개인 API가있어 uiviewcontroller가 속합니다. 매우 편리하다;) 내 생각 엔이 뷰가 뷰 컨트롤러 (controller.view)에 추가 될 때이다.이 속성은 설정된다.

관련 문제