0

하나의 메인 UIView가있는 하나의 단일 MainViewController가 있습니다. 나는이 메인 뷰를 다양한 서브 뷰로 구성했다.다른 UIViewController에서 하나의 UIViewControllers 속성에 액세스하는 방법?

일부 하위보기에는 고유 한 ViewController가 있습니다.

은 (누구의 위임 주로 MainViewController이다) 대부분의 IT의 행동에 대한 대리인으로 별도의 UIViewController- SecondaryViewController를 사용하는 다른 UIView의를로드하는 용기가있는 주요보기를 말할 수 있습니다.

이 컨테이너 뷰 비록을 MyContainerViewController이다

MyContainerViewController *myContainerController = 
     [[MyContainerViewController alloc] ...]; 
[self addSubView: myContainerController.view]; 

통해 MainViewController에로드 물론 myContainerController.view위한 컨트롤러이다. 이 컨트롤러 내부에서 MainViewController 속성에 액세스하는 방법은 무엇입니까? 특히 MainViewController - self.navigationController 속성에 액세스하여 새 ViewController를 푸시해야합니까? :)

이 말이 맞는가요? 내가 어떻게 든 SecondaryViewController 내부 MainViewController에 대한 참조를 유지해야 할 것 때문에 관련 일종의 캐스팅 될 거라고 가정?

답변

2

MainViewController의 SecondaryViewController에서 새로운 ViewController를 푸시하는 것은 의미가 없습니다. 코드의 디자인이 엉망이됩니다. 아이 오브젝트는 그 부모 메소드에 액세스 해 메소드를 호출합니다. 다른 말로하면 : 나쁜 코드. SecondaryViewController에서 상태가 변경된 MainViewController에 대한 대리 호출을합니다. 그런 다음 MainViewController가 호출을 수행하기로 결정할 수 있으며 SecondaryViewController는 MainViewController 구현에 대해 알지 못합니다.

그래서 : SecondaryViewController에서 프로토콜을 만듭니다. MainViewController를 SecondaryViewController의 대리자로 지정하십시오. 새 ViewController를 푸시하는 MainViewController에서 대리자 메서드를 구현합니다.

+0

실수 이것은 내가하고 싶은 접근 방식이라고 생각합니다. 내가 프로토콜을 작성하고보기 컨트롤러에 대한 대리자를 제대로 작성하는 방법에 대해 알아야 할 것 같습니다. Interface Builder로 쉽게 할 수없는 것 같습니다. –

+0

최소한 대리인에게 IBOutlet을 만들 수 있습니다. 그러면 MainViewController를 SecondaryViewController의 위임자로 쉽게 만들 수 있습니다 (MainViewController가 NIB에서로드 될 때 SecondaryViewController가 있어야 할 때만 관련이 있습니다) –

0

원하는 하위보기 컨트롤러를 포함하는보기 컨트롤러의 속성으로 하위보기 컨트롤러를 노출하십시오.

앱 대리인의 속성으로 루트보기 컨트롤러를 노출하고이를 합성합니다.

MyAppDelegate* myAppDelegate = [[UIApplication sharedApplication] delegate]; 

가 그럼 그냥 원하는 뷰 컨트롤러에 액세스하려면 속성의 당신의 체인을 사용

먼저, 다른 UIViewController에 액세스 AppDelegate에 대한 참조를 가져올

.

SubSubViewController* ssvc = myAppDelegate.rootViewController.subViewController.subSubViewController; 

일부 사람들은 대리인에 대한 참조를 얻기 위해 sharedApplication 클래스 메서드의 사용에 눈살을 찌푸린 다,하지만 난 (아직) 그것을 위해 고통을 여러 응용 프로그램에서 그것을 사용하지했습니다. 다른 방법은 ViewController 계층을 통해 appDelegate를 파이프하는 것입니다.

+0

죄송합니다.하지만이 사실은 SecondaryViewController가 실제로 부모 인 MainViewController의 구현을 알게합니다. 잘못된 코드 디자인. –

+0

Nope - MainViewController는 SecondaryViewController를 알고 있지만 Secondary는 Main을 알 수 없습니다. (모든 참조 점은 "아래로"참조). –

+0

대리인을 개체로 사용하고 있습니다. 귀하의 응용 프로그램 대리인 가정 UIViewController 종류의 변수가 있습니다. 이것은 UIApplicationDelegate가 프로토콜이며 준수하는 메소드를 가지고 있기 때문에 잘못되었습니다. 인스턴스 변수가 아닙니다. 참조 : http://developer.apple.com/library/ios/#documentation/uikit/reference/UIApplicationDelegate_Protocol/Reference/Reference.html. 그리고 당신이 당신의 대리자를 객체로 사용할 때, 제가 전에 도와 준 것처럼, 당신은 "상향"참조를 갖게 될 것입니다. –

관련 문제