2013-04-01 2 views
1

StoryBoard setup사용자 정의 iOS UIViewController를 인스턴스화하고 Storyboard에서 NIB를 사용하는 방법은 무엇입니까?

두 개의 UIViewController가있는 StoryBoard (iOS 5 이상) 프로젝트가 있습니다.

작업은 프로그래밍 방식으로 두 번째의 UIViewController (CoordinationController)를 인스턴스화하는 것입니다하지만 사용자 인터페이스 디자인을 위해의 XIB 파일을 사용하고 싶습니다.

분명 해결

는 스토리 보드에 XIB가 작동하지 않거나 문서화되지 않은 이유로 사용할 수 없습니다 복사합니다. 두 번째 스토리 보드의보기 컨트롤러에보기가없는 경우에도 동일한 이름의 XIB가 표시됩니다. 작동하지 않습니다.

어떻게 두 번째의 UIViewController를 인스턴스화하고 XIB 파일을 사용 하는가?

답변

4

당신은 nib 파일을로드하고 initWithCoder에서보기 설정할 수 있습니다 CoordinationController 방법 :

-(id)initWithCoder:(NSCoder *)aDecoder { 
    if (self = [super initWithCoder:aDecoder]) { 
     UINib *nib = [UINib nibWithNibName:@"CoordinationController" bundle:nil]; 
     NSArray *nibObjects = [nib instantiateWithOwner:self options:nil]; 
     self.view = nibObjects.lastObject; 
    } 
    return self; 
} 
+0

이, 감사 괜찮습니다,하지만 난 너무 FirstViewController의 인스턴스를보고 싶습니다. 그냥 보너스 질문 : 그것은 너무 segue와 함께 작동 할 수 있습니까? – BootMaker

+0

@BootMaker, 무슨 뜻인지 이해가 안됩니다. FirstViewController는 CoordinationController의 하위 클래스입니까? – rdelmar

+0

아니요, 다른 컨트롤러, 실제로 첫 번째 컨트롤러 또는 RootController입니다.하지만 어떻게 CoordinationController를 인스턴스화 할 수 있는지는 중요합니다. – BootMaker

5

아주 간단한 해결책은 뷰 컨트롤러의 nibName 속성을 재정의하고 인코딩 펜촉의 이름을 반환하는 것입니다 로드 할보기 :

사용 된 스토리 보드 컴파일러에서 생성 한 펜촉의 이름에 액세스 할 수 있습니다. 이 펜촉은 storyboard.storyboardc 번들 안에 패키지로 포함 된 앱 번들에 포함되어 있습니다.

이 nibName 구현에서 nil을 반환 할 수없고 로더가 rules described in the docs을 사용하여 펜촉을 검색하는 기본 동작을 얻을 수 없다는 것에 약간 놀랐습니다.

다르게는 키 nibName 가진 사용자 정의 속성을 통해 런타임 뷰 컨트롤러 스토리 자체 원하는 펜촉 이름을 설정할 수있다 (이것은 속임수). 재산에 대해 문서화되지 않은 세터가 있기 때문에 이것은 효과가 있습니다. 실제로 그렇게하지 마십시오!

뷰가 컨트롤러의 라이프 사이클의 정상적인 과정에서로드되기 때문에 이것이 더 좋은 해결책이라고 생각합니다. 즉, 컨트롤러가 표시되기 전에 지연로드됩니다. init 메소드. 그리고 그것은 적은 코드입니다.

+0

여러 개의 .xibs를 표시해야하지만 단일보기 컨트롤러 만 사용해야하는 경우가 있습니다. 나는 이것과 싱글 톤을 사용하여 그것을 해결했다. .xib 이름은 싱글 톤 속성 인 NSString * xibName에 설정되었습니다. 그런 다음보기 컨트롤러가 스토리 보드에서 인스턴스화되었습니다. 내부 - (NSString *) nibName xibName을 가지고 리턴 한 라인을 추가했습니다. 완벽하게 일했습니다. –

관련 문제