2014-10-19 59 views
5

要在我的應用和擴展之間共享代碼和資源,我在我的項目中嵌入了Cocoa Touch Framework,此框架包含一些資源,如圖像和xib文件。iOS 8:從Cocoa Touch Framework獲取資源

我的問題是:如何從主應用程序和擴展程序訪問這些資源?

我用這個方法:iOS 8 Extension: how to use xib inside Cocoa Touch Framework in extensions?

但這將使應用程序的包和擴展捆綁,這是不是一個很好的重複副本的所有資源。

有沒有更好的方法?

更新:

現在我主要的應用程序可以使用這樣的代碼框架訪問資源:

+(NSBundle*)frameworkBundle 
{ 
    NSString *frameworkDirPath = [[NSBundle mainBundle] privateFrameworksPath]; 
    NSString *frameworkBundlePath = [frameworkDirPath stringByAppendingPathComponent:@"MyFramework.framework"]; 
    NSBundle *frameworkBundle = [NSBundle bundleWithPath:frameworkBundlePath]; 

    return frameworkBundle; 
} 

但這並不用於擴展工作。

回答

15

試試這個:

NSBundle *frameworkBundle = [NSBundle bundleForClass:[AnyClassFromFramework class]]; 
+0

它拋出一個不同的路線比是代碼在問題中,爲什麼?我們應該使用什麼? – Gabox 2015-11-20 21:24:22

+0

使用bundleForClass創建包比從路徑創建要好。 我在開發過程中遇到了這個問題,其中我們正在測試應用程序中的coredata momd文件,之後我們將該應用程序轉換爲框架並添加了momd作爲資源。 現在正在使用momd文件的測試應用程序正在mainBundle中查找它,而現在它不正確。 momd文件在框架內移動。所以總是使用bundleForClass並提供最接近/直接使用資源的類。 – Omkar 2016-11-14 11:23:38

5

這爲我工作:

NSBundle * frameworkBundle = [NSBundle bundleWithIdentifier:@"<framework-bundle-identifier>"]; 
+0

這僅適用於動態庫,對於靜態庫它返回nil。 – njuxjy 2017-10-20 06:05:49

0

對於迅速,可以考慮使用:

let bundle = NSBundle(forClass: self.dynamicType) 
+0

這僅適用於Swift 3+。 – emrekyv 2016-09-30 11:51:09