2015-04-15 100 views
5

我有images.xcassets列出了正確的複製束資源,並且我試圖在文件名稱本身聲明:MSB_big_icon,然後嘗試在images.xcassets中添加路徑。NSbundle pathforresource找不到文件

有人可以告訴我我做錯了什麼嗎?

NSString *path = [[NSBundle mainBundle]pathForResource:@"/Raymio_android_images/MSB_big_icon.imageset/MSB_big_icon" ofType:@"png"]; 
NSLog(@"path: %@", path); 
MSBIcon *tilecon = [MSBIcon iconWithUIImage:[UIImage imageWithContentsOfFile:path] error:&error]; 

回答

2

大衛Ansermot是正確的,xcassets是一個更好的辦法,強烈偏愛。如果你不能使用它(例如在較舊版本的iOS上運行),仍然將所有內容放在一個目錄中並使用imageNamed:。這對手動加載文件具有顯着的緩存優勢。

一個asset catalog(xcassets)是一種(相對)新的,統一的管理圖像資源的方式。圖像不再作爲磁盤上的單獨文件訪問。相反,imageNamed:會諮詢資產目錄並提取正確的資產。

在資產目錄之前(仍然是,對於非圖像),資產被存儲在本地化的目錄中。所有未本地化的資產將被放到一個名爲Resources的目錄中(無論這些文件可能出現在您的源代碼樹中,以及這些文件如何排列在您的Xcode文件夾中)。本地化的文件將存儲在目錄中,如English.lprojFrench.lproj。當您調用NSBundle調用加載MyImage時,它會按照用戶配置的順序查看每個本地化目錄,並且如果在任何這些目錄中都找不到它,它會在Resources中查找。

現在可以通過在Xcode中將目錄標記爲目錄引用來將完整目錄存儲爲「資源」。在這種情況下,整個目錄將被複制到Resources或適當的本地化目錄中。爲了在這樣的目錄中查找文件,您可以使用NSBundle方法的...inDirectory:版本。 因此,大多數情況下,您只想使用imageNamed:,這將從資產目錄中提取東西(如果可用),然後搜索本地化目錄,然後查看Resources。如果你需要找到一個非圖像,或者出於某種原因,你要的文件真實路徑,你可以計算出它是這樣的:

NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png"]; 

如果該資源是在一個目錄樹(因爲它在Xcode的目錄參考),你可以這樣訪問:

NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" 
               ofType:@"png" 
              inDirectory:@"Raymio_android_images/MSB_big_icon.imageset"]; 
+0

也許我只是不得不求助於標準,在我的腦海裏嘮叨,我沒有得到這個工作。我的理解錯誤是,如果某些東西在複製束資源下列出,那意味着列出的文件夾被添加到束中,然後可以通過NSBundle使用?因爲儘管images.xcassets位於副本包res上,但使用最後一個代碼段仍然無效。名單。 – DevilInDisguise

+0

如果您將文件放入複製束資源中,它將位於根文件夾中。它上面的所有子目錄都將被刪除。如果你想保留目錄,你必須複製目錄本身(正如我記得的那樣,這已經有一段時間了),你必須使目錄成爲「目錄引用」而不是「文件夾」。 –

+0

但是爲什麼Xcode會打擾已經添加文件和images.xcassets複製束資源,因爲它已經在根文件夾中,另一方面根文件夾中有不在複製束中的各種文件夾/文件。從您的評論中可以看出,當您需要將應用程序根文件夾之外的某個文件夾添加到應用程序時,複製包資源更多,對嗎?無論哪種方式,我仍然有點困惑,爲什麼這種方法仍然無法正常工作。 – DevilInDisguise

0

下面是從我的應用程序的一個代碼爲例:

NSString *appKey = @"Applications__GENERIC"; 
NSString *path = [[NSBundle mainBundle] pathForResource:appKey ofType:@"plist"]; 
appData = [NSDictionary dictionaryWithContentsOfFile:path]; 

的 「Applications__GENERIC.plist」 存儲這樣的:
enter image description here


其他解決方案: 使用images.xcassets。 然後在你的代碼加載一個圖像,使用代碼:

UIImage *image = [UIImage imageNamed:@"MyImageWithoutExtension"]; 

不要把任何路徑或擴展,只有圖像的名字

+0

我對+ imageWithContentsOfFile感興趣,因爲這是在示例應用程序中使用的方法,因此我想知道它是如何工作的(或不)。我確實已經創建了一些像你發佈的圖片,但是再一次,我感興趣的是爲什麼我無法獲得上述工作 – DevilInDisguise

+0

可以添加擴展名,所以沒有必要建議該圖片的名字_必須是_沒有擴展名。 – holex

+0

更新了我的答案。 @holex,如果你使用xcassets你不需要。只有圖片資產名稱;) –

0

嘗試使用這樣的:

NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png" inDirectory:@"Raymio_android_images/MSB_big_icon.imageset"]; 

什麼,你也可以做調試是打印出

[[NSBundle mainBundle] bundleURL] 

然後導航到該文件夾​​並查看文件夾結構是否與您使用的路徑相對應。

我今天就在這裏掙扎,希望它也適合你。

+0

但由於images.xcassets列出在複製束資源下,我認爲我會很好從那個位置開始。同時我想知道爲什麼bundlePath返回與bundleURL相同的路徑,但使用不同的密鑰 – DevilInDisguise

相關問題