iOS 子工程(下沉組件 私有庫) 調(diào)用文件、圖片 等資源 方法
發(fā)現(xiàn)問題:在子工程里面 使用
[[NSBundle mainBundle] pathForResource:ofType:] 不能找到目標資源文件
原因:
[[NSBundle mainBundle] pathForResource:ofType:] 是獲取主程序包(Main Bundle)中資源文件路徑的方法。主程序包是指你的應(yīng)用程序本身,而不包括子工程或子項目。
那么要在子工程中獲取資源文件路徑,就要使用相對于子工程 bundle 的路徑。這時,我們應(yīng)該使用子工程 bundle 的路徑來進行資源文件的獲取。
方法
使用bundleForClass: 方法來獲取子工程 bundle,然后使用這個 bundle 來獲取資源文件的路徑。這樣就能夠在子工程中獲取資源文件的路徑了。
NSBundle *subprojectBundle = [NSBundle bundleForClass:[self class]];//類對象,通過這個參數(shù)來獲取特定類所在的 bundle,以便在該 bundle 中定位資源文件。
NSString *resourcePath = [subprojectBundle pathForResource:@"ResourceFileName" ofType:@"png"];
//等價 NSString *resourcePath = [[subprojectBundle resourcePath] stringByAppendingPathComponent:@"ResourceFileName.png"];
if (resourcePath) {
UIImage *image = [UIImage imageWithContentsOfFile:resourcePath];
// 在這里使用獲取到的圖片
}
eg:如果你有一個名為 SubprojectViewController 的類,你可以這樣使用 bundleForClass: 方法:
NSBundle *subprojectBundle = [NSBundle bundleForClass:[SubprojectViewController class]];
在這個示例中,[SubprojectViewController class] 返回的是 SubprojectViewController 類的類對象,它將被用來確定該類所在的 bundle。
總之,bundleForClass: 方法的參數(shù)是一個類對象,通過這個參數(shù)來獲取特定類所在的 bundle,以便在該 bundle 中定位資源文件。
其他討論:[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: 是否適合子工程中獲取資源文件路徑方法?
適用場景:
-
適用于主程序包中的資源: 這種方法適用于獲取主程序包(Main Bundle)中的資源文件路徑。如果你要獲取主程序包中的資源,這個方法是一個很方便的選擇。
-
子文件夾: 如果你想要在主程序包中的特定子文件夾中獲取資源文件,可以將子文件夾名稱作為參數(shù)傳遞給
stringByAppendingPathComponent:方法。 -
資源文件的位置: 確保資源文件位于主程序包中,并在 Xcode 中設(shè)置正確的配置,以便它們被復(fù)制到 bundle 中。
-
無法用于其他 bundle: 這個方法主要用于獲取主程序包中的資源文件,對于其他 bundle,如靜態(tài)庫或動態(tài)庫中的資源,使用這種方式可能會失敗,因為它依賴于主程序包的路徑。
小結(jié):
- [NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:是一個適用于獲取主程序包中資源文件的簡單方法,特別是當你知道資源文件位于主程序包的哪個子文件夾時。但如果你需要獲取其他 bundle 中的資源文件,使用其他方法,比如使用 bundleForClass:更為合適。
- 有時在某些特定情況下,這個方法可能會在私有庫中返回資源文件路徑。可能的情況之一是,私有庫被添加到主項目中后,其資源文件被復(fù)制到主程序包的位置,從而使這種方式能夠正常工作。但是,這并不是一個可靠的方法,因為它依賴于特定的項目結(jié)構(gòu)和配置。
- 為了保證代碼的可移植性和健壯性,建議在處理資源文件時使用更可靠的方法,如使用
bundleForClass:方法來獲取正確的 bundle,并從 bundle 中獲取資源文件路徑。這種方法更具通用性,適用于不同項目結(jié)構(gòu)和配置的情況。
==========華麗分割線==========
以上bundleForClass:保證了 子工程正確獲取了資源圖片的路徑。
還需注意:
1.圖片和資源文件要在子工程的合理位置 : 比如和Classes 文件并列 建立一個 Resource 文件夾 資源都放在里面

2.圖片和數(shù)據(jù)庫資源要在KFZTechs.podspec 中體現(xiàn)

3.私有庫提交代碼時候打tag 需要是最新的tag 和 版本號
綜上:要正確獲取到子工程的圖片 文件資源 需要
(1)bundleForClass:獲取子工程bundle
(2)圖片 文件資源 的Resource 放在與Classes并列位置
(3)圖片和數(shù)據(jù)庫資源要在KFZTechs.podspec 中體現(xiàn)
(4) 私有庫提交代碼時候打tag 需要是最新的tag 和 版本號
posted on 2023-08-09 11:00 ACM_Someone like you 閱讀(463) 評論(0) 收藏 舉報
浙公網(wǎng)安備 33010602011771號