2011-10-03 6 views
0

두 개의 .nib 파일을 같은 이름으로 사용할 수 있습니까? 나는 엑스 코드 4 사용하고, 나는 인터페이스, 즉 여러 버전 갖고 싶어 : 다른 폴더에 MainMenu.xib을, 그래서 나는 그들에 액세스 할 수 있습니다.nib 파일의 여러 버전

[[MainMenuViewController alloc] initWithNibName:@"MainMenu" bundle:skinBundle]

어디에 내 skinBundle 경로에서 번들 같습니다

skinBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"skinFolderPath" ofType:nil]

내가 응용 프로그램을 빌드 할 때, 모든 디렉토리가 하나의 MainMenu.nib를 결과 평평하고 있습니다. 폴더가 인 폴더를 추가하면 디렉토리 트리가 보존되지만 .xib 파일은 .nib로 컴파일되지 않습니다.

이것을 달성 할 방법이 있습니까? 또는 nibs의 여러 버전을 관리하는 더 좋은 방법일까요?

답변

1

"자원 번들"이라는 Xcode에서 추가 대상을 만들 수 있습니다. 이것들은 번들 구조 (예 : .app 또는 .framework 번들)를 갖지만 2 진 코드를 포함하지 않습니다. 그 번들에 자원을 추가 주 대상의 "복사 번들 리소스"단계로 그 대상의 제품을 추가 한 다음 등 다음과 같이 코드를 사용하여 인스턴스화하는 동안 그 번들을 사용

NSString *skinBundlePath = [[NSBundle mainBundle] pathForResource: @"MyBundle" ofType: @"skin"]; // or whatever it's called 
if (skinBundlePath) { 
    NSBundle *skinBundle = [NSBundle bundleWithPath: skinBundlePath]; 
} 

위의 조각이 당신을 가정 대상의 래퍼 확장자을 "skin"으로 설정하고 "MyBundle"이라고 이름을 지정하십시오.

Xcode 3 (저는 4 가지가 없습니다)에서 프로젝트 -> 새 대상으로 이동하여 대상을 추가 할 수 있습니다. Mac OS X에서 "로딩 가능 번들"을 선택하십시오 (iOS를 사용하는 경우 라 할지라도). 머리 꼭대기에는 더 이상 작동하지 않는 구성이 필요하지 않지만, 리소스가 당신이 그들을 추가 할 때 오른쪽 번들.

너무 복잡하게 들리는 경우로드 가능한 번들을 만드는 새 프로젝트를 만들어 기본 프로젝트의 종속성을 만들 수도 있습니다. 다시, 서브 프로젝트의 빌드 제품을 기본 프로젝트의 자원 "번들 자원 복사"단계에 추가하십시오.

+0

감사! 이것은 내가 찾고 있었던 바로 그 것이다. Xcode 4에서는 _Project Navigator_ - _ Add Target_ button-> _Mac OS X Framework 및 Library_ -> _Bundle_에서 프로젝트를 선택하여 번들을 생성했습니다. 그런 다음 응용 프로그램의 대상 _ "번들 리소스 복사"_ 스테이지에서 모든 리소스 파일을 제거하고 그에 따라 번들에 추가합니다. 다음으로 응용 프로그램의 _ "대상 종속성"_ 스테이지에 번들을 추가하고 프로젝트 탐색에서 _Products_ 그룹의 번들을 _ 기본 응용 프로그램의 _ "복사 번들 리소스"_로 끌어 왔습니다. – Johnnywho

+0

번들의 타겟 빌드 설정을 변경해야한다고 덧붙여 야합니다 : _ SDK SDK_를 '최신 iOS', _ 지원 플랫폼 _을 'iphonesimulator iphoneos'로 변경해야합니다. 이것이 없다면 번들 제품은 주요 타겟과 같은 디렉토리에 있지 않을 것입니다. _ "번들 자원 복사"_ 스테이지에서 오류가 발생했습니다. 내가 만난 또 다른 문제는 펜촉이로드시 참조 된 이미지를 캐싱한다는 것과 두 개의 다른 번들에 같은 이름의 이미지가 두 개있는 경우 캐싱으로 인해 하나만 표시된다는 것입니다. 당신은 우아한 해결책이 있습니까? – Johnnywho

+0

'[NSImage imageNamed :]'대신'[NSImage imageWithContentsOfFile :]'를 사용하십시오. 메모리를 효율적으로 사용하지는 못하지만 문제가 발생하지는 않습니다. –

관련 문제