2012-08-29 94 views
15

我想創建一個框架,保持我在項目中使用的一些常見代碼。 我發現在線教程,並設法創建一個框架,但我仍然有一個問題與資源(xibs,圖像等)有關。IOS靜態框架與內部資源

比方說,我有一個MainViewController.xib它有一個UIImageView使用test.png。所有這些都在我的框架包中。

當我在另一個項目中使用框架時,我將它添加到「Copy Bundle Resources」構建階段。問題在於,xib只能使用類似dummy.framework/Resources/MainViewController.xibUIImageView之類的路徑訪問,因此無法加載test.png

看來,UIImageView將嘗試從bundle的根目錄加載png,而不是從其中存儲xib的相對文件夾加載png。

有沒有人設法創建一個框架的代碼和資源,並在另一個項目中使用它?

+1

嗨安德烈,你能告訴我你怎麼加的.bundle文件到框架目錄...我我無法做到這一點。我的shell腳本中可能有一些錯誤。 – Apple

回答

0

簡答:你不行。

當您編譯應用程序時,將使用「main」項目的資源生成包,忽略鏈接框架中的資源。這包括圖像,xib的,plist的等(任何非源文件)

你需要做的是將這些資源添加到您的主項目,以便它們可用於您的應用程序內,而不是最快樂的方式,但它會工作。

+0

好吧,資源被複制,但在一個子文件夾中。 –

+2

這是最接近真實事實的答案。但是,您可以強制xcode從框架中複製資源,但它們將被放置在主包中的子文件夾中。這使得他們在屁股上加載他們很痛苦。 –

+0

你現在可以做到這一點 – doozMen

1

基本框架不包括大多數類型的資源,包括資源利用this "fake" framework library

您與其中包含實際的框架.embeddedframework文件夾結束了,但還包括要添加到複製包資源的任何資源建立階段。我用它來包含xibs,核心數據模型,圖像和plists

+0

是的,但是如果你(在框架中)有一個xib,它使用了也在框架中的資源(比如說一個圖像)。你能否在測試應用程序中加載xib? –

+0

我沒有在我面前的項目,但我敢肯定,這將是確定的,給它一個鏡頭... – wattson12

+0

我已經得出結論,我想要達到的是不是真的可能。由於Interface Builder無法顯示子文件夾中的圖像(它們在運行時工作),但以捆綁形式提供任何資源實際上並不可行。最好的方法是簡單地添加一個zip文件和靜態庫,用戶可以在其項目中使用該文件夾。 –

4

我不再手動管理框架,而是使用和recommendCocoaPods來代替。


原來的答覆:

  1. 使用fake framework @提到wattson12。它也會編譯和保存資源。
  2. 通過this script的啓發,將它添加到你的目標的資源複製到你的應用程序:

    SOURCE_PATH="${TARGET_BUILD_DIR}/MYFramework.framework/Resources/" 
    TARGET_PATH="${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MYFrameworkResources.bundle" 
    mkdir -p $TARGET_PATH 
    cp -R $SOURCE_PATH $TARGET_PATH 
    

你也可以只拖動框架將複製的資源一步,但隨後你會添加不必要的標題和編譯代碼。

編輯

要使用從IB這些資源,例如png文件,替換:

MyImage 

由:

MYFrameworkResources.bundle/MyImage.png 

它將預覽殘缺的圖像圖標,但將在運行時起作用。

負荷碼筆尖:

[NSBundle loadNibNamed:@"MYFrameworkResources.bundle/MyNib" ... 

最後,你可以在一個NSBundle類添加這些方法來緩解訪問筆尖資源,我在你的主束或MYFrameworkResources.bundle:

@implementation NSBundle (MyCategory) 

+ (NSString *)pathForResource:(NSString *)name 
         ofType:(NSString *)extension 
{ 
    // First try with the main bundle 
    NSBundle * mainBundle = [NSBundle mainBundle]; 
    NSString * path = [mainBundle pathForResource:name 
              ofType:extension]; 
    if (path) 
    { 
     return path; 
    } 

    // Otherwise try with other bundles 
    NSBundle * bundle; 
    for (NSString * bundlePath in [mainBundle pathsForResourcesOfType:@"bundle" 
                  inDirectory:nil]) 
    { 
     bundle = [NSBundle bundleWithPath:bundlePath]; 
     path = [bundle pathForResource:name 
           ofType:extension]; 
     if (path) 
     { 
      return path; 
     } 
    } 

    NSLog(@"No path found for: %@ (.%@)", name, extension); 
    return nil; 
} 

+ (NSArray *)loadNibNamed:(NSString *)name 
        owner:(id)owner 
        options:(NSDictionary *)options 
{ 
    // First try with the main bundle 
    NSBundle * mainBundle = [NSBundle mainBundle]; 
    if ([mainBundle pathForResource:name 
          ofType:@"nib"]) 
    { 
     NSLog(@"Loaded Nib named: '%@' from mainBundle", name); 
     return [mainBundle loadNibNamed:name 
            owner:owner 
           options:options]; 
    } 

    // Otherwise try with other bundles 
    NSBundle * bundle; 
    for (NSString * bundlePath in [mainBundle pathsForResourcesOfType:@"bundle" 
                  inDirectory:nil]) 
    { 
     bundle = [NSBundle bundleWithPath:bundlePath]; 
     if ([bundle pathForResource:name 
          ofType:@"nib"]) 
     { 
      NSLog(@"Loaded Nib named: '%@' from bundle: '%@' ", name, bundle.bundleIdentifier); 
      return [bundle loadNibNamed:name 
            owner:owner 
           options:options]; 
     } 
    } 

    NSLog(@"Couldn't load Nib named: %@", name); 
    return nil; 
} 

@end 

它會先看看你的應用程序包,然後在MYFrameworkResources.bundle等

+0

謝謝,但界面生成器仍然不會正確地檢測資源 –

+0

你有問題的圖像? (預先考慮路徑是否足夠)或與Nibs?您還可以檢查您的構建目錄,以查看資源在應用程序中的複製位置。 – Rivera

12

我知道這是一個古老的線程,但爲了保持新peopl從使這裏同樣的錯誤e是一張紙條:

由於Xcode的6 iOS8上,蘋果已經完全支持第一方動態框架解決方案建成欲瞭解更多信息請看這裏:https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_6_0.html#//apple_ref/doc/uid/TP40014509-SW14

但短期的它是,創建一個新項目並選擇Cocoa Touch Framework模板。

+0

一切都很好,但你是否真的設法將圖像資源包含在Xcode 6中創建的動態框架中。我自己嘗試了所有的東西,但無法使它工作!似乎是來自Apple的非常少的文檔。 – simonthumper

+9

是的。它非常簡單,但可能並不明顯。簡單地在正常的框架中包含你的圖像,但爲了加載它們,你需要引用你的框架。所以'[NSBundle bundleWithIdentifier:@「com。<#company#>。<#framework#>」];' –

+0

你不需要在創建一個包或任何東西時玩弄。 Xcode的框架爲你處理。但是你必須從這個默認包中加載它們。我發現使用框架類別的快捷方式創建一個NSBundle類別非常有用。 –

7

我創建了一個框架,目標和訪問圖像的資產目錄內,我做了以下內容:

UIImage *img = [UIImage imageNamed:@"IMAGE_NAME_HERE" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:[UITraitCollection traitCollectionWithDisplayScale:[UIScreen mainScreen].scale]]; 
+0

非常感謝您,我浪費了大量時間試圖爲其尋找解決方案。而這一個工作:) – Ismail

-1

由於Xcode的7,我們現在可以使用資產目錄。在我的實驗中,我發現你可以在同一個工作區中引用不同的項目文件,而不需要在構建階段微觀管理資源,或者擔心目標。

+0

這個答案是無關的問題 – doozMen

0

爲了在從動態的框架加載圖像斯威夫特3

UIImage(named: "name", in: Bundle(for: type(of: self)), compatibleWith: nil)