2011-08-24 103 views
6

假設我有一個現有的iOS或Mac框架,我們將其稱爲Test.framework。這個框架已經成功地編譯和鏈接了(一個技巧是爲iOS部分的i386和armv6/7構建的),並且工作得很好。將圖像(或其他資源)添加到Mac或iOS框架

現在我想爲它添加一個圖像,我們稱之爲'test.png'。我已經複製到我的框架的資源文件夾,使我有以下結構:

ls Test.framework 

- Headers -> Versions/Current/Headers 
- Resources -> Versions/Current/Resources 
- Test -> Versions/Current/Test 
- Versions 

ls Test.framework/Resources 

- Info.plist 
- test.png 

然而,當我用我的框架,創建一個項目,我不能訪問圖像。

我已經試過:

[UIImage imageNamed:@"test.png"] 
[UIImage imageNamed:@"Test.framework/test.png"] 
[UIImage imageNamed:@"Test.framework/Resources/test.png"] 

但沒有摸索出總是給我回了nil對象。

任何想法?

編輯

經過一番深入調查,似乎什麼,我試圖完成,不能在iOS上進行。原因是最終的應用程序包(.app)不會複製爲Mac OS編譯的應用程序所在的私有框架。

這在iOS Bundle Structures documentation中進一步詳述。

感謝Rob Keniger和xuzhe的感謝幫助。我將信譽xuzhe的答案,因爲它實際上是我最初的問題最恰當的答案(即使羅布評論讓我深入挖掘該問題)

回答

4

「imageNamed:」方法只適用於您的應用程序中的圖像束。您應該使用

[[UIImage alloc] initWithContentsOfFile:path]; 

改爲。

關於路徑,因爲我不確定「Test.Framework」是否在你的App bundle中,所以我不能給你一個示例代碼。但如果劑量,下面的代碼應該工作:

NSString* path = [Nsstring stringWithFormat:@"%@/Test.framework/Resources/test.png", [[NSBundle mainBundle] bundlePath]]; 
+0

說''imageNamed:「方法僅適用於您的應用程序包中的圖像」並非完全正確。如果我添加一個包(比如test.bundle)到我的項目中,並且這個包中包含test.png,那麼[UIImage imageNamed:@「test/test.png」]將很好地工作。 – apouche

+0

然而,你的解決方案很有趣,但我沒有捆綁到我的應用程序中的框架(它可以安裝在commond框架文件夾中) – apouche

+0

@apouche如果你正在應用程序包中添加一個包,然後調用'[UIImage imageNamed: @「test.bundle/test.png」];'沒問題,因爲test.bundle也在主包中。如果不是,我懷疑「imageNamed:」可以找到它。 – xuzhe

3

你可以捆綁使用[NSBundle bundleForClass:[SomeClass class]]特定類。您只需傳入框架中定義的類,即可獲得對框架包的引用。

然後,您可以使用NSBundle的方法向圖像的路徑請求捆綁包,然後使用NSImageinitWithContentsOfFile:方法創建圖像。

請注意,您不應該硬編碼路徑。永遠。獲取資源路徑有許多不同的功能和方法,您不需要對它們進行硬編碼。

+1

這很聰明,但不幸的是它沒有真正給出預期的結果。當我做了'[NSBundle bundleForClass:[SomeClass class]]'它給了我與主包完全相同的對象。原因是從我的Test.framework中使用的所有類都被添加到最終的項目二進制文件中,而不是「複製」到最終的.app路徑中。所以最後資源被跳過:( – apouche

+0

感謝您的幫助,我想完成的任務不能在iOS上完成請參閱我的編輯如果您想了解更多信息 – apouche

相關問題