2014-04-04 41 views
3

在我的Iphone應用程序中,我以前通過執行以下代碼將一個標準plist文件加載到字典中。最近我將源代碼和plist文件複製到一個新的包中,我將它編譯成框架並在原始應用程序中使用。所有代碼都在運行,但plist加載代碼無法再找到settings.plist文件。看着路徑,它似乎仍然在尋找主應用程序的文件。IOS框架問題加載嵌入式資源plist文件加載

我是否需要以某種方式更新此捆綁包以閱讀框架嵌入式資源?

NSBundle *bundle = [NSBundle mainBundle]; 
NSString *path = [[bundle resourcePath] stringByAppendingPathComponent:@"settings.plist"]; 
_plistDictionary = [[NSDictionary alloc] initWithContentsOfFile:path]; 

回答

7

如果我正確地理解了你,是的。

+[NSBundle mainBundle]返回NSBundle對象,該對象對應於當前應用程序可執行文件所在的目錄。簡而言之,它將返回主應用程序的bundle,這不是您想要的(您希望在您的應用程序包中包含一個框架包)。

既然你想獲得捆綁爲你的框架,如果代碼加載的plist駐留在框架本身,你可以做這樣的事情:

NSBundle* bundle = [NSBundle bundleForClass:[self class]]; 

那麼這將返回該包的框架。或者更具體地說,該類(此代碼)所在的包。

+0

這是正確的想法,但bundleForClass似乎仍然是返回同捆的mainBundle。我認爲這是因爲框架被編譯幷包含在mainBundle的應用程序中,並在運行時成爲它的一部分。 – Miro

+0

所以它不是一個真正的框架,而是你剛剛在你的應用程序捆綁包中獲得某種二次包?如果是這樣,那麼你可以嘗試類似:NSBundle * bundle = [[NSBundle mainBundle] pathForResource:@「MyBundle」ofType:@「bundle」];或者不管它是什麼。 – hsoi

+0

這是一個框架,爲了簡化構建,我恰好碰巧與應用程序在同一個項目中。生成框架文件,並將其作爲框架資源包含在應用程序本身中。 (http://longtrieuquang.wordpress.com/2013/04/29/how-to-build-custom-ios-framework-with-xcode/) – Miro

1

老問題,但希望這可以幫助別人......

試圖在嵌入式框架來定位資源(在我的情況下,筆尖文件),NSBundle.mainBundle()沒有工作對我也。我設法用這種極其迂迴方法(SWIFT代碼)來找到它:

if let frameworkURL = NSBundle(forClass: MyClass.self).URLForResource("MyFrameworkName", withExtension: "framework", subdirectory: "Frameworks") { 
    if let bundle = NSBundle(URL: frameworkURL) { 
     if let resourceURL = bundle.URLForResource("MyResourceName", withExtension: "nib") { 
      // do something with resourceURL 
     } 
    } 
} 

變化MyClass"MyFrameworkName""MyResourceName",和適合您的需要"nib"

似乎必須有更好的方式,但不知道它是什麼。

(提示:通過獲取的NSBundle.mainBundle().bundlePath值,然後打開在Finder中該路徑探索在編譯的應用程序包中的文件。)

+0

我爲我的myFramework更改我的類,但出現此錯誤:無法將類型模塊的值轉換爲期望的參數類型AnyClass – user2924482