2011-10-03 36 views
0

有什麼方法可以讓兩個.nib文件具有相同的名稱?我使用的Xcode 4,我想擁有的接口即多個版本:MainMenu.xib在不同的文件夾,這樣我就可以訪問它們:.nib文件的多個版本

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

在我的skinBundle會從通道束:

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

當我構建應用程序時,所有目錄都變平了,結果只有一個MainMenu.nib。當我將文件夾添加爲文件夾引用時,目錄樹被保留,但沒有一個.xib文件被編譯爲.nib文件。

有什麼辦法可以達到這個目的嗎?或者也許更好的方式來管理多個版本的筆尖?

回答

1

您可以在Xcode中創建名爲「資源包」的其他目標。它們具有捆綁結構(如.app或.framework捆綁包),但不包含二進制代碼。你的資源加入到這些集合,這些目標的產品添加到你的主要目標的「複製包資源」的階段,然後使用代碼實例中使用這些軟件包,例如如下:

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

上面的代碼片段假定您將目標的包裝擴展名設置爲「皮膚」並將其命名爲「MyBundle」。

在Xcode中3(我沒有4得心應手),您可以通過將項目中添加一個目標 - >新目標。從Mac OS X中選擇「Loadable Bundle」(即使你使用的是iOS)。除了我的頭頂,你不需要任何進一步的配置就可以使它工作,但是你必須注意資源在當你添加它們時,你會看到右束

如果這聽起來過於複雜,它也可以創建生成一個可加載捆綁一個新的項目,並讓你的主項目的依賴;再次,將子項目的構建產品添加到主項目的資源「複製包資源」階段。

+0

謝謝!這正是我所期待的。在Xcode 4中,我設法通過在_Project Navigator_ - > _Add Target_ button-> _Mac OS X Framework&Library_ - > _Bundle_中選擇項目來創建包。然後我從應用程序的目標_「複製軟件包資源」_階段中刪除所有資源文件,並相應地將它們添加到軟件包中。接下來,我將Bundles添加到應用程序的_「Target Dependencies」_ stage,並將項目導航中_Products_組的Bundle拖到_「Copy Bundle Resources」_主應用程序中。 – Johnnywho

+0

我必須補充說,我必須更改Bundle的目標構建設置:_Base SDK_到'Latest iOS'和_Supported Platforms_到'iphonesimulator iphoneos'。沒有這些,Bundle產品將不會與主目標位於同一個目錄中。在_「Copy Bundle Resources」_階段中產生錯誤。我遇到的另一個問題是,nib在加載時緩存引用的圖像,當兩個不同捆綁包中有兩個具有相同名稱的圖像時,由於按名稱緩存,只會顯示一個圖像。你有沒有優雅的解決方案? – Johnnywho

+0

而不是使用'[NSImage imageNamed:]',使用'[NSImage imageWithContentsOfFile:]'。它的記憶效率較低,但會阻止這種情況的發生。 –