0

4 탭이있는 TabBar 응용 프로그램이 있습니다. 네 개의 탭에는 모두 네비게이션 컨트롤러가 있습니다. 설정 탭에서 나는 "피드백"에 대한 셀이있는 표를 가지고 있습니다. 셀을 클릭하면 몇 개의 필드가있는 피드백 양식이 포함 된 FeedBackView 컨트롤러가 푸시됩니다. 여기에는 카테고리에 대한 텍스트 필드가 있습니다. 텍스트 필드를 터치하면 모달 뷰 컨트롤러 (FeedBackModalView)에 피커가 표시됩니다. FeedBackModalView 컨트롤러의 viewDidLoad 메서드에서 NSLog(@"%@", self.parentViewController).을 입력했습니다. 콘솔에서 parentViewController를 TabBar 컨트롤러로 표시합니다. 왜 그런가요? 해당 컨트롤러에서 모달보기를 제공하고 있으므로 FeedBackView 컨트롤러를 parentView로 표시하면 안됩니까?보기 컨트롤러 이해

나는 분명히 희망한다.

+0

어떤 개체에 액세스하려고합니까? 아마도 다른 사람이 액세스하는 변수를 가리킬 수 있습니다. –

+0

모달보기에서 FeedBackView 컨트롤러에 액세스하고 싶습니다. 선택기에서 선택한 카테고리 다음에 카테고리 텍스트 필드를 설정하는 메소드가 있습니다. 간단한보기 기반 응용 프로그램에서는 [self.parentViewController setCategoryText] (FeedBackController에 정의 된 setCategoryText)를 사용합니다. 하지만이 중 하나에서 parentViewController는 tabBarController입니다. –

답변

1

UITabBarController와 함께 presentModalViewController을 사용하면 몇 가지 문제가 있으며 최근 SDK 버전에서는 메서드의 내부 동작이 계속 변경되었다고 생각합니다. 결론은 루트 컨트롤러를 사용하여 뷰 컨트롤러를 모달로 표시해야한다는 것입니다. 탭 바 인터페이스를 사용하는 경우 UITabBarController 객체가됩니다.

이전 버전의 SDK에서는 이전 버전의 탭 표시 줄 컨트롤러에있는보기 컨트롤러에 모달보기를 표시 할 때 모달보기가 전체 화면으로 표시되지 않았습니다. 이는 예상되거나 문서화 된 동작이 아닙니다. 이제 모달보기가 어디서나 전체 화면으로 표시되는 것 같습니다. [self presentModalViewController:animated:] 메서드가 내부적으로 self을 확인하고 0 이외의 parentViewController 속성을 가진 경우 메시지를 부모보기 컨트롤러에 보냅니다 (관찰 내용을 설명 할 것입니다) .

내 기억이 애매하고 아마도 누군가 나를 교정해야합니다. 그러나, 나는 여전히 이해하는 것이 직접적이라고 믿는다. (그리고 어쩌면 연습 할 수도있다.) presentModal...은 루트보기 컨트롤러에서만 작동한다.

+0

감사합니다. 궁금 해서요, 어떤 뷰에서 rootViewController를 얻을 수있는 방법이 있습니까? –

+0

뷰 컨트롤러를 가져 오는 '기본 제공'방법이 없으므로 루트 VC와 다른 뷰를 직접 통신해야합니다. 이러한 뷰는 루트 vc의 뷰에 의해 유지되며, 물론 루트 vc에 의해 유지됩니다. 따라서 일부 뷰 객체에서 루트 VC를 유지하여 유지주기를 생성하지 마십시오. 기본적으로 루트 vc가 뷰 객체의 델리게이트임을 의미하는 뷰의 속성에 루트 VC를 할당 할 수 있습니다 (보유하지 않음). 이 경우 위임은 좋은 습관이지만 필요에 따라 알림이나 KVO를 대신 사용할 수도 있습니다. – MHC

관련 문제