2010-05-27 3 views
3

NSViewController를 포함하는 커스텀 NSBundle을 업로드 할 프로젝트를 찾고 있습니다. 이로드 됐어요 후 내 메인 프로그램에서 나는 ...NSBundle NSViewController 로딩하기

id principalClass = [loadedBundle principalClass]; 
id instance = [[principalClass alloc] init]; 
[localLabel setStringValue:[instance name]]; 
NSView *incomingView = [[instance viewController] view]; 
[localView addSubview:incomingView]; 
[localView display]; 

을 번들 처리하는 코드를 가지고 그리고 번들의 주요한 클래스의 초기화 방법은 ... 다음과 같습니다

-(id) init { 
    if(self = [super init]){ 
     name = @"My Plugin"; 
     viewController = [[ViewController alloc] initWithNibName:@"View" bundle:nil]; 
    } 
    return self; 
} 

View.nib은 번들 프로젝트에있는 펜촉입니다. 하지만 번들을로드 할 때마다이 오류가 발생합니다 ...

2010-05-27 09 : 11 : 18.423 PluginLoader [45032 : a0f] 이름이 새겨진 것을 찾을 수 없습니다. 번들 경로에서보기 : (null) 2010- 05-27 09 : 11 : 18.424 PluginLoader [45032 : a0f] - [NSViewController loadView]가 "View"펜촉을로드 할 수 없습니다.

[label setStringValue:[instance name]]; 레이블 텍스트를 올바르게 설정했기 때문에 모든 것이 유선 상태라는 것을 알고 있습니다. 또한 번들에있는 모든 클립을 가져 와서 기본 응용 프로그램 프로젝트에로드하면 모든 것이 예상대로 작동합니다. 내 번들에서 "보기"를 올바르게 참조 할 수있는 방법에 대한 의견이 있으십니까?

감사합니다.

답변

2

init 메서드에서는 nil을 번들 매개 변수에 전달하면 안됩니다. UIViewController 설명서에 따르면 nil을 전달하면 주 번들 (응용 프로그램의 것)에서 NIB 파일을 조회하게됩니다. 이는 원하는 내용이 아닙니다.

- (id) initWithBundle:(NSBundle *)bundle { 
    if(self = [super init]){ 
     name = @"My Plugin"; 
     viewController = [[ViewController alloc] initWithNibName:@"View" bundle:bundle]; 
    } 
    return self; 
} 

을 그리고 다음과 같이 사용 :

이 같은 전문 초기화를 사용하여 해결할 수 있습니다

Class principalClass = [loadedBundle principalClass]; 
id instance = [[principalClass alloc] initWithBundle:loadedBundle]; 
+0

'[loadedBundle principalClass]'는'id'가 아닌'Class' 타입을 반환합니다. 가독성을 위해 아마도'principalClass' 변수에'Class' 유형을 사용할 것입니다. – dreamlax

+0

머리 위로. 그리고 20 분 안에! 고마워. – Staros

0

"View.xib는 펜촉입니까?" 그것은 xib이거나 펜촉입니다. xib은 펜이 아닙니다. xib 파일은 인터페이스 빌더에서만 사용할 수 있으며 배포 응용 프로그램에서는 nib 파일로 변환해야합니다. 그것이 ibtool이하는 일입니다. Xcode는 단순히 xib 파일을 복사하는 것이 아니라 nib 파일로 변환 한 ibtool을 통해 실행하여 Resources 폴더에 저장합니다.

+2

XIB는 XML 형식으로, 펜촉입니다. 인터페이스 빌더는 xibs 또는 nibs로 작업 할 수 있지만 xib는 SCM 도구로 더 잘 작동하기 때문에 개발하기에 더 편리합니다. – dreamlax

+0

@dreamlax : Apple의 설명서는 xib 파일을 배포 할 의도가 없다는 사실에 대해 매우 분명합니다. 디버그 빌드를 만들 때에도 복사 단계에서 xib를 nib 파일로 변환해야합니다. Apple은 nib 파일을 처리 할 수있는 모든 메소드/기능이 동일하게 xib 파일을 처리 할 수있는 곳을 보장하지 않습니다. PDF (벡터 그래픽, 텍스트 및 비트 맵)와 같은 xib 파일과 PNG 파일과 같은 nib 파일 (비트 맵에만 해당)을 고려하십시오. PNG 이미지를 처리 ​​할 수있는 모든 이미지 기능이 PDF 문서를 처리 할 수있는 것은 아닙니다. – Mecki

+1

nib/xib * 파일 형식 *을 nib 파일과 혼동하고 있습니다. [이 문서] (http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/IB_UserGuide/BuildingaNibFile/BuildingaNibFile.html#//apple_ref/doc/uid/TP40005344-CH11-SW14)를 참조하십시오. xib 파일 형식은 여전히 ​​nib 파일을 나타냅니다. nib 파일에는 xib 및 nib의 두 가지 형식이 있습니다. xib가 소개되기 전에 (더 나은 SCM 지원의 유일한 목적을 위해) nib 파일은 nib 파일 형식 중 하나의 형식을가집니다. 링크에서 : "xib 파일 형식은 nib 파일 객체 그래프의 병합 된 아카이브를 나타냅니다." – dreamlax

관련 문제