2016-03-15 25 views
1

我有一個主項目包含10個以上的包。我有兩個名爲map_bubble_right_normal的圖像,一個在主包中,另一個在子包(SCommon.bundle)中。我寫的代碼如下:UIImage在主包中加載錯誤的圖像

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

的代碼在AppDelegatedidFinishLaunchingWithOptions已經寫。

我想加載我保存在主束的圖像。但是,從子包(SCommon.bundle)加載圖像的代碼的結果。

我想保存在主束可能是錯誤的圖像該圖像(可能複製的問題)。因此,我將顯示ipa內容以查看保存在根目錄下的「map_bubble_right_normal」文件。圖像是正確的!!!!!

我不知道爲什麼imageNamed:將加載從子束(SCommon.bundle)的圖像。我試圖刪除應用程序並重新啓動iPhone,結果是一樣的。而且,我試圖刪除XCode的派生數據,並清理該項目。圖像仍然從子束(SCommon.bundle)加載。

另外我在iOS 8的和iOS 9設備測試該問題。

只有那些改變bundleId(主束)的方法,可以到目前爲止解決臨時的問題。

我知道的UIImage的緩存功能,但我不明白爲什麼了詭異的一幕會發生。

我真誠地要求你一位偉大的上帝求救。謝謝〜

+0

「超過10捆」是什麼意思?這些其他(非應用)軟件包是什麼,它們與應用程序有什麼關係? – trojanfoe

+0

似乎你的「子捆綁」實際上是你的主要捆綁。該文檔明確指出imageNamed:在主包中查找。它應該對其他圖像的行爲相同。 – ff10

+0

對不起,我只是想知道爲什麼會發生這種情況。我知道如何避免這個問題。 – Startry

回答

1

謝謝大家的回答。抱歉,我誤導了我們所有人的捆綁。

我找到了問題的原因。錯誤圖像不是來自Assets.car的子包。問題的原因實際上應該歸咎於物理目錄中的Image.assert。 CocoaPods將所有匹配「* .assets」複製到Assets.car。

我在Apple Developer forum提出了同樣的問題,並找到了問題的關鍵提示。

Cocoapods問題相對於問題Pods copy resource script overrides default xcasset bahaviour

如果您的Pod Repo添加了名稱與*.xcassets相匹配的任何文件夾,則Pod_resources.sh腳本將複製Pod_Root中的每個*.xcassets。 Pod_resources.sh的

關鍵代碼:

if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 
    ... 
    # Find all other xcassets (this unfortunately includes those of path pods and other targets). 
    OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 
    while read line; do 
    if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 
     XCASSET_FILES+=("$line") 
    fi 
    ... 
fi 

條件XCASSET_FILES將滿足,如果你的波德有添加任何xcassets文件。

0

從主束加載圖像試試這個:

UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"map_bubble_right_normal" ofType:@"png"]]; 
+0

對不起,我想知道爲什麼會發生這種情況。我不想根據文檔替換'imageNamed:' – Startry

+0

@Startry:「如果這是第一次加載圖像,該方法會在應用程序的主包中查找具有指定名稱的圖像。」 - 來自之前加載的其他包的圖像?在這之前有沒有其他的捆綁圖像? – gvuksic

+0

我試着刪除XCode的所有派生數據,清理項目,刪除設備的應用程序,然後將應用程序構建到我的設備上。如果'imageNamed'工作屬性像docs那麼它不能被緩存。 – Startry

0

如果你想從mainBundle加載試試這個代碼:如果您想從子包中加載

NSBundle* myBundle = [NSBundle mainBundle]; 
NSString* myImage = [myBundle pathForResource:@"Seagull" ofType:@"jpg"]; 

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"YourBundleName" ofType:@"bundle"]; 
NSBundle *subBundle = [NSBundle bundleWithPath:bundlePath]; 
NSString* myImage = [subBundle pathForResource:@"Seagull" ofType:@"jpg"]; 

參考here

+0

對不起,我只想知道爲什麼會發生這種情況。我知道如何避免這個問題。 – Startry

+0

那麼你想知道爲什麼'imageNamed'從子包加載圖像,但不是從mainBundle加載圖像? –

+0

是的。如果代碼工作屬性,它應該從主包加載圖像。但是,來自其他包的圖像加載。 – Startry

0

我發生過一些相同的情況。而不是你上面提到的兩個包,我沒有用正確的名字顯示正確的圖像。最後,我發現關鍵是圖像有一個後綴jpg而不是png。我改成png的圖像,一切都轉好了。也許這是你發生的一種可能的情況。嘗試一下,祝你好運。 :)

PS:這裏的a related link作爲參考。