2011-08-26 68 views
0

我試圖將一組資源捆綁到一個捆綁包中,並且他們通過NSBundle從代碼訪問它們。爲什麼我的包忽略了它的info.plist?

到目前爲止,我可以很好地從捆綁包中獲取資源,但是我無法讓NSBundle實例從捆綁的Info.plist文件中獲取任何元數據。

奇怪的是,我的第一次嘗試工作,並正確地獲取元數據,但自那時以來,我一直無法複製這種行爲,並且捆綁包總是返回null爲bundleIdentifier或infoDictionary中的其他項目。

我已代碼減少到下面的測試情況:

NSString *pathToTestBundle = [[NSBundle mainBundle] pathForResource:@"test" 
                ofType:@"testBundle"]; 
NSLog(@"path to Test Bundle: %@", pathToTestBundle); 

NSBundle *testBundle = [NSBundle bundleWithPath: pathToTestBundle]; 
NSLog(@"testBundle: %@", testBundle); 

NSString *identifier = [testBundle bundleIdentifier]; 
NSLog(@"testBundle identifier: %@", identifier); 

NSURL *testResourceURL = [testBundle URLForResource:@"vanGroup" 
             withExtension:@"png"]; 
NSLog(@"testBundle test resource: %@", testResourceURL); 

NSImage *testImage = [[NSImage alloc] initByReferencingURL:testResourceURL]; 
[imageView setImage:testImage]; 

NSLog(@"%@", [testBundle infoDictionary]); 

其中給出這樣的:通過測試包(編輯的線路長度)

path to Test Bundle: /.../BundleTester.app/Contents/Resources/test.testBundle 
testBundle: NSBundle </../BundleTester.app/Contents/Resources/test.testBundle> 
     (not yet loaded) 
testBundle identifier: (null) 
testBundle test resource: file://.../BundleTester.app/Contents/Resources/test.testBundle/Resources/vanGroup.png 
BundleTester[45083:707] { 
    NSBundleInitialPath = "/Users/diggory/Library/Developer/Xcode/DerivedData/BundleTester-hcbsnhudsdfzlyggjbvlkdbrtxrw/Build/Products/Debug/BundleTester.app/Contents/Resources/test.testBundle"; 
    NSBundleResolvedPath = "/Users/diggory/Library/Developer/Xcode/DerivedData/BundleTester-hcbsnhudsdfzlyggjbvlkdbrtxrw/Build/Products/Debug/BundleTester.app/Contents/Resources/test.testBundle"; 
} 

以我Xcode項目被添加爲文件夾參考並具有以下結構:

test.testBundle 
    Info.plist 
    Resources 
     vanGroup.png 

圖像資源加載正確,但val在plist中的用戶被忽略。

plist中如下:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>CFBundleIdentifier</key> 
    <string>com.monkeyfood.testbundle</string> 
    <key>badger</key> 
    <string>Bodger</string> 
</dict> 
</plist> 

我缺少的東西?我究竟做錯了什麼?
非常感謝。

+0

我從來沒有使用捆綁。但是,並不是每個軟件包都包含「內容」文件夾嗎?爲什麼你使用包? – lbrndnr

+0

輝煌 - 我忘記了內容文件夾。它現在有效,非常感謝。 – Diggory

+0

添加了一個答案,所以它的官方:) – lbrndnr

回答

1

「目錄」 文件夾丟失解釋。

1

看來你的bundle對象指的是Bundle,但Bundle尚未加載,這就是爲什麼當你調用bundleIdentifier時你會得到null。從Apple的文檔套件中加載代碼

要加載bundle的可執行代碼,請使用NSBundle的加載方法。如果加載成功或者代碼已經加載,則此方法返回YES,否則返回NO。

你需要調用[bundle load]像這樣:在Bundle Loading

NSBundle *testBundle = [NSBundle bundleWithPath: pathToTestBundle]; 
[testBundle load]; // Load the bundle... 

更多的信息在蘋果的文檔

+0

感謝您的評論。捆綁中沒有代碼。它只是一個包含圖像等的資源包。調用'load'不會改變行爲。 – Diggory

相關問題