0

긴 제목에 대해 사과 하긴하지만 실제로는 내가 말할 수있는 가장 정확하고 설명이 가장 짧은 버전입니다.사용자 지정 컨테이너보기 컨트롤러에서 포함 된 컨테이너보기 컨트롤러의 자식에게 메시지 전달?

iOS 5 및 스토리 보드로 작업하는 맞춤 segue 유형으로 맞춤 컨테이너보기 컨트롤러를 구현하고 있습니다. 또한 UINavigationControllerDelegate와 비슷한 기능을하는 포함 된 뷰 컨트롤러에 대한 대리자 프로토콜을 제공합니다. 현재, 특정 작업을 수행하기 위해 알아야 할 내 맞춤 세그먼트와 관련된 조건을 세그먼트보기 하위 뷰 컨트롤러에 알려주는 사용자 지정 컨테이너에서 대리인 메시지를 보내고 있습니다.

이것은 .h 파일의 프로토콜을 준수하도록 지정할 수있는 내 자신의 UIViewController 하위 클래스로 충분히 간단합니다.

그러나 내 사용자 지정 컨테이너의 포함 된보기 컨트롤러 (예 : UINavigationController, UITabBarController)가 기본 제공 컨테이너 자체 인 경우 전송하는 대리인 메시지가 해당 컨테이너에 반드시 맞지는 않지만 컨테이너가 현재 표시하고있는 활성 자식 뷰 컨트롤러 내장 된 컨테이너는 보통 view(Will|Did)(Disa|A)ppear 콜을 아이들에게 전달하지만 내 전달 메시지를 내 사용자 정의 메시지로 확장하는 일반적인 방법은 보이지 않습니다.

신속하고 지저분한 솔루션은 기본 제공 컨테이너를 서브 클래스 화하고 여기에 대리인 메시지 전달을 추가하는 것입니다. 예를 들어, MyTabBarController은 위임 프로토콜을 따르고 위임 메시지를 selectedViewController으로 전달합니다. 다른 방법으로는 사용자 정의 컨테이너에 포함 된보기 컨트롤러가 자체 컨테이너 유형이지만, 더 끔직하고 언젠가 내 사용자 정의 컨테이너 안에 중첩 될 수있는 미래의 컨테이너 유형을 고려할 수없는 경우 능동적으로 스니핑하는 것입니다.

이 전체 맞춤형 봉쇄 배치는 현재 사용중인 응용 프로그램에만 한정되어 있으므로 요구 사항이 무엇인지 알기 때문에 해킹 할 수 있습니다. 은이 일반 작업을 수행하려면이 필요하지만 따르고 싶습니다. 미래의 애플 리케이션에서 잠재적 인 재사용을 통해 미래에 훨씬 더 일반적으로 만들 필요가있는 경우를 대비하여이 영역에서 좋은 설계 연습을하십시오.

그럼 제가 이미 설명한 두 가지 해결책을 뛰어 넘는 제안은 무엇입니까?

답변

0

조금 더 생각하고 실험 해본 후, 세 번째 접근법을 생각해 냈습니다. 그것은 여전히 ​​내가 원하는 것보다 일반적이지는 않지만, 이전에 가지고 있던 것에서 한발 더 나아가서 빌트인 컨테이너 컨트롤러의 하위 클래스 화에 의존하지 않게되었습니다.

필자는 특정보기 컨트롤러에 위임 메시지를 전달하기 위해 탭 모음 컨트롤러를 원했습니다. 올바른 메소드 서명의 구현으로 MessageForwarding이라는 UITabBarController 카테고리를 만들었습니다. 카테고리 메소드가 방금 self.selectedViewController에 대한 동일한 호출을 전달하여 결과를 리턴합니다.

내 사용자 지정 컨테이너 클래스가이 범주를 가져오고, 이제 voilà, tab bar 컨트롤러가 마술처럼 올바른 작업을 수행하고 컨테이너에서 보내는 대리인 메시지를 전달합니다.

분할보기 및 탐색 컨트롤러와 사용할 수있는 사용자 지정 컨테이너에 비슷한 범주를 구현하는 것은 간단합니다.

1

나는 공식 프로토콜을 사용할 것이며, 부모와 자식이 의사 소통하기를 원할 때 프로토콜과 일치하는지 물어볼 것입니다. 카테고리와 비슷하지만 카테고리 메소드를 호출 할 때마다 e 인스턴스를 묻지 않아도됩니다.일단 프로토콜에 응답하면 요청하십시오. 그러면 원하는 프로토콜 방법을 호출 할 수 있습니다.

NSObject의 -conformsToProtocol:을 참조하십시오.

+0

Apple이 동의 한 것처럼 보입니다. 이 페이지 하단의 http://developer.apple.com/library/ios/ipad/#featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllerers/CreatingCustomContainerViewControllers.html#//apple_ref/doc/uid/TP40007457-CH18-SW13을 참조하십시오. – leftspin