2010-07-11 9 views
0

iPhone 응용 프로그램에서 반응 체인이 어떻게 작동하는지 정확하게 이해하는 데 어려움이 있습니다.이전 firstResponder를 복원하는 방법은 무엇입니까?

내 상황은 다음과 같습니다. 탭 막대 컨트롤러에 설치된 두 개의 UIViewController 있습니다. 그들에게보기 제어기 A와 B를 호출하십시오. 그것들은 어느 쪽도 참조가 없거나 다른 것에 대해 안다는 의미에서 관련이 없습니다.

A와 B 모두 원격 제어 이벤트 (재생/일시 중지/중지 버튼)에 응답해야합니다. 컨트롤러 A는 이러한 이벤트에 항상 응답하려고하지만 B는 사용자가 특정 기능을 선택했을 때만 응답하려고합니다. 내 앱이 시작되면 A가 즉시 첫 번째 응답자가되어 원격 제어 이벤트를 수신 할 수 있습니다. B가 이벤트를 받기를 원하면 첫 번째 응답자가되고 A 대신 이벤트를 받기 시작합니다.

리모컨을 사용하여 B를 완료하면 문제가 발생합니다. 이 시점에서 B는 resignFirstResponder를 호출합니다. 그 후에는 A 나 B도 원격 제어 이벤트를 얻지 못합니다.

B가 첫 번째 응답자 상태를 중단하면 이전에 첫 번째 응답자였던 것이 복원 될 것이라고 가정했습니다. 이게 어떻게 작동하는거야?

그렇지 않은 경우 A를 첫 번째 응답자로 복원하려면 어떻게해야합니까? A와 B는 별도의 탭이므로 B는 A에 대한 참조가 없거나 A가 첫 번째 응답자로 가정된다는 것을 기억하십시오. 그래서 A. 명시 적으로 becomeFirstResponder를 호출하고 싶지 않습니다. 대신에 이전 응답기를 가져 와서 복원하는 방법이 필요합니다 (제 생각에). 나는 이것이 왜 자동적으로 일어나지 않는지에 대해 당황 스럽다.

덕분에, 프랭크

답변

1

The docs on UIResponder뿐만 아니라 Event handling guide for iPhone OS 는 응답자 체인이 바로 당신이 될 것으로 기대 방법 배치되어 있지 않음을 나타냅니다. 연결될 수 있고 당겨질 수있는 잠재적 인 응답자의 연쇄가 아닙니다. 오히려 현재 사용자에게 표시되는 뷰 계층 구조와 직접 연관됩니다.

이것은 B가 첫 번째 응답자를 사임하거나 B의보기 컨트롤러 (있는 경우) 또는 슈퍼 뷰가 첫 번째 응답자가 될 때 canBecomeFirstResponder:이 실행됨을 의미합니다. 불가능할 경우 보기 컨트롤러 또는 superview가 첫 번째 응답자가되며 UIApplication까지 끝납니다.

A와 B가 하나의 하위 뷰인 계층 구조에 A와 B가 없으면 B가 사임 할 때 응답기 체인이 첫 번째 응답자를 A에 반환하지 않습니다. 대신 B는 슈퍼 응답자에게 첫 번째 응답자를 사임합니다. 가장 가능성있는 일은 A와 B 위에있는보기에 becomeFirstResponder:을 구현하는 것입니다.이 메서드는 첫 번째 응답자를 A로 넘기려고합니다. 그러면 B가 첫 번째 응답자를 잡고 나중에 사임 할 때, superview는 그것을 A로 되돌려 줄 것입니다.

+0

감사합니다. 나는 그것에 대해 좀더 실험했고, 당신의 설명이 의미가 있습니다. 보기 B가 첫 번째 응답자가되는지 여부는 실제로 중요하지 않습니다. 해당 탭으로 전환하자마자 A보기가 첫 번째 응답자가되고 원격 제어 이벤트 수신을 중지합니다. 제 경우의 일반적인 수퍼 뷰는 아마도 탭 표시 줄 컨트롤러의보기 일 것입니다. 내가 원하는 것을하기 위해 UITabBarController를 하위 클래스 화해야합니까? – user332000

+0

예 - 하위 클래스 UITabBarController가 작동하는 것으로 보입니다. 아무도 듣지 않을 때, 서브 클래스는 원격 제어 이벤트를 얻습니다. 이제해야 할 일은 이벤트를 적절한 장소로 파견하는 우아한 방법을 찾아내는 것입니다. – user332000

+0

A. IIRC에 첫 번째 응답자를 건네기 위해 A의 "becomeFirstResponder :"메소드를 호출하십시오. – Kalle

관련 문제