6

View Builder nib의 기본 View Outlet을 Interface Builder에서 설정하는 데 문제가 있습니다. 여기 내 설정이다 :UINavigationController NIB는 파일의 소유자에게보기 권한이 필요합니까?

 
MenuController.xib 
    File's Owner (MyNavCtrlrSubClass : UIViewController) 
    Navigation Controller (UINavigationController) 
    Navigation Bar (UINavigationBar) 
    Root View Controller (Nib Name is set to load AnotherViewController.nib) 
     Navigation Item -> (UINavigationItem) 

이 모든 :

내가 모달보기로 탐색 컨트롤러를로드합니다 TabBar의 기반 응용 프로그램 ...

MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc]initWithNibName:@"MenuController" bundle:nil]; 
[tabBarController presentModalViewController:menu animated:anim]; 

MenuController 자체는 다음과 같이 구성되어 있습니다 MyNavCtrlrSubClass가로드 될 때를 제외하고는 잘 작동하지만 다음과 같은 오류가 발생합니다.

분명히 이런 일이 일어나고 있습니다. File 's Owner에는 뷰를위한 콘센트 연결이 없습니다. 질문은 내가 그 견해로 무엇을 설정해야 하는가? 무엇인가가 처음에 설정되어야 하는가? 네비게이션 바는 MenuController.xib의 유일한 후보이지만, 이렇게하면 UINavigationBar 자체의 크기를 전체 화면 모드로 바꿀 수 있습니다.

분명히 IB에 뭔가 빠져 있는데, 뭐라 구요? MyNavCtrlrSubClass.m에는 UINavigationController의 IBOutlet을 제외하고는 코드 자체가 없습니다. IB에서 전적으로 이것을 설정하려고 실수하고 있습니까? 아이디어는 하나의 펜촉에 모달 네비게이션 컨트롤러를 유지하고 모든 뷰는 별도의 펜촉으로로드하지만 MenuController는 네비게이션 용 컨테이너이며 뷰 자체가 포함되어 있지 않으므로 분명히 잘못 설계하고 있습니다. :)

내가 왜 다른 방식으로 설계하지 않는지 궁금하다면, IB가 이상적인 계층 구조를 구축하도록 요청하는 방법에 대한 (아마도 잘못 생각한) 인식에 복종하려고하기 때문입니다.

도움을 주시면 감사하겠습니다.

답변

5

파일 소유자가 NIB 파일에서 사용되는 방법을 이해하지 못할 수도 있습니다. 파일의 소유자 under another question을 설명하는 응답을 작성했습니다. 당신은 MyNavCtrlrSubClass의 인스턴스를 생성하고로드를 말할

[[MyNavCtrlrSubClass alloc] initWithNibName:@"MenuController" bundle:nil] 

@ "MenuController"

이 라인을 호출

. MenuController.xib 파일에는 두 번째 관련이없는 UINavigationController가 들어 있습니다. 런타임에 MenuController.nib가로드되면 두 번째 탐색 컨트롤러가 만들어집니다.

두 번째 문제는 탐색 컨트롤러가 자체보기를 만들고 관리하기 때문에 NIN 파일을로드하도록 UINavigationController에 지시하는 것이 실제로 의미가 없다는 것입니다. 루트 뷰 컨트롤러를 만들고 NIB 파일을로드하도록 뷰 컨트롤러에 알려야합니다.

이 시도 :

당신의 XIB 파일은 다음과 같습니다
MyRootViewController *rootController = [[[MyRootViewController alloc] initWithNibName:@"AnotherViewController" bundle:nil] autorelease]; 
MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc] initWithRootViewController:rootController]; 

:

  • 파일의 소유자
    • 에 UIView를 (MyRootViewController로 설정 클래스,보기 콘센트가 이후의 UIView에 연결)
    • 서브 뷰 A
    • 서브 뷰 B이 모든 작동 방법 편하지있어 후

, 당신은 또한 당신이 코드를 수행하기 시작했다처럼 하나 개의 XIB 파일에 네비게이션 컨트롤러와 루트 뷰 컨트롤러의 인스턴스를 고려해 볼 수 있습니다 당신이 올렸습니다.

+0

유익한 답변을 보내 주셔서 감사합니다! 나는 이것으로 무엇을 할 수 있는지를 곧 알게 될 것이며 곧 다시 올 것이다. 지금 당장 물어 봅시다. Interface Builder에서 가능한 한 많이 디자인하는 모달 Navigation Controller 펜촉을 어떻게로드 하시겠습니까? 예제에서와 같이 View Controller 코코아를 설정 한 다음 프로그래밍 방식으로 Navigation Controller를 만들거나 IB에서 뷰 계층 구조 만 정의 할 수 있습니까? –

+0

참고 : 프로그래밍 방식으로 탐색 컨트롤러를 만드는 것이 프로그래밍 방식으로 자체보기 컨트롤러 계층을 설정해야한다는 것을 의미하는 것입니다. 그런 다음 탐색 컨트롤러를 시작으로 IB에서 멀리 떨어져 있습니다. –

+1

코드에서 탐색 컨트롤러와 루트보기 컨트롤러를 만들고 IB의 루트보기 컨트롤러에 대한보기를로드 할 수 있습니다. 어색하지 않습니다. 네비게이션 컨트롤러를 만들 수도 있습니다. 루트 컨트롤러는 루트 컨트롤러의보기와 별도의 XIB에 있습니다. 이 별도의 XIB는 일반적으로 MainWindow.xib입니다. MainWindow.xib 파일이로드되면 두 개의 뷰 컨트롤러가 생성됩니다. 루트 뷰 컨트롤러가 먼저 뷰를 필요로하면 두 번째 XIB 파일에서 뷰를로드합니다. 이것이 일반적인 방법입니다. –

0

IB에서는 MenuController nib에서 UIView를 추가하고 해당보기를 콘센트로 설정합니다. UIViewController에 대한 뷰를 설정해야합니다. Here은 기본 설정을 보여주는 Apple 페이지의 빠른 링크입니다. 그것은 당신의 현재 무대에서 당신을 도울 지 모르지만.

+0

문제는 내 네비게이션 컨트롤 펜촉에 뷰가 없다는 것입니다. 제약 조건은 각 개별 펜촉을 구분하기 때문에 문제는 개념적 또는 디자인 지향적이며 문제는 아닙니다. 어떤 경우에도 감사드립니다. –

+0

AnotherViewController에 어떤보기가 설정되어 있습니까? 문제가있는 곳인 것처럼 보입니다. – Jordan

+0

AnotherViewController는 단일 뷰가있는 View Controller 펜촉입니다. 그래도로드되지 않습니다. 문제는 MenuController가 뷰를 원할 때 생기는 어딘가에서 일어난다. 그러나 컨트롤 대신 요청을 자동적으로 전파 할 수 있기를 바랄 뿐이다. 당신의 답변에 의하면, 펜촉에 파일 소유자가 반드시 펜촉이 필요하지는 않다는 것을 암시하는 것처럼 들립니다. 그것이 당신의 이해입니까? –

1

이 질문의 핵심은 Travis 자신이 말한 것입니다. "Navigation Controller nib를 어떻게로드하고 인터페이스 작성기에서 최대한 많이 디자인하겠습니까?" 또한이 예제에서 UINavigationController와 연관된 UIViewController를 의미합니다.

이 해석을 사용하면 대답은 UINavigationController를 완벽하게 구성 할 수없고 UIViewController를 단일 XIB에 구성 할 수 없다는 것입니다. 그렇습니다. 이렇게하기를 원한다면 직관적이어서 미쳐서는 안됩니다.

내가 이것을 할 수 없다고 말하면, 가장 일반적으로 사용되는 프레임 워크 방법은 이것을 처리 할 방법이 없다는 것을 의미합니다. [UINavigationController alloc] initWithMegaNibName이 없습니다. 예, 단일 XIB에 거의 모든 것을 넣을 수 있으며 특수한 방법으로 객체를 수화하는 코드를 작성할 수 있습니다. 그러나 나는 그것이 당신이 찾고있는 것이라고 생각하지 않습니다.

존 (Jon)이 제안한대로 두 개 이상의 XIB를 사용할 수 있지만 그다지 자기가 덜 포함되어 있으므로 코드에서 컨트롤러의 일부 또는 전부를 더 간단하게 수행하는 사람들이 많습니다.

다른 개발자 플랫폼과 마찬가지로 인터페이스 빌더 기능과 코드 사이에 1 : 1 대응이 없습니다. 나는 일반적으로 디자이너가 자산을 만드는 데 최대한 많이 참여할 수있게하는 것을 선호하지만, 대부분은 객관적인 것을 코딩하지 않는다는 것을 알고 있습니다.