iOS 子工程(下沉组件 私有库) 调用文件、图片 等资源 方法
发现问题:在子工程里面 使用
[[NSBundle mainBundle] pathForResource:ofType:] 不能找到目标资源文件
原因:
[[NSBundle mainBundle] pathForResource:ofType:]
是获取主程序包(Main Bundle)中资源文件路径的方法。主程序包是指你的应用程序本身,而不包括子工程或子项目。
那么要在子工程中获取资源文件路径,就要使用相对于子工程 bundle 的路径。这时,我们应该使用子工程 bundle 的路径来进行资源文件的获取。
方法
使用bundleForClass:
方法来获取子工程 bundle,然后使用这个 bundle 来获取资源文件的路径。这样就能够在子工程中获取资源文件的路径了。
NSBundle *subprojectBundle = [NSBundle bundleForClass:[self class]];//类对象,通过这个参数来获取特定类所在的 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: 方法的参数是一个类对象,通过这个参数来获取特定类所在的 bundle,以便在该 bundle 中定位资源文件。
其他讨论:[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: 是否适合子工程中获取资源文件路径方法?
适用场景:
-
适用于主程序包中的资源: 这种方法适用于获取主程序包(Main Bundle)中的资源文件路径。如果你要获取主程序包中的资源,这个方法是一个很方便的选择。
-
子文件夹: 如果你想要在主程序包中的特定子文件夹中获取资源文件,可以将子文件夹名称作为参数传递给
stringByAppendingPathComponent:
方法。 -
资源文件的位置: 确保资源文件位于主程序包中,并在 Xcode 中设置正确的配置,以便它们被复制到 bundle 中。
-
无法用于其他 bundle: 这个方法主要用于获取主程序包中的资源文件,对于其他 bundle,如静态库或动态库中的资源,使用这种方式可能会失败,因为它依赖于主程序包的路径。
小结:
- [NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:是一个适用于获取主程序包中资源文件的简单方法,特别是当你知道资源文件位于主程序包的哪个子文件夹时。但如果你需要获取其他 bundle 中的资源文件,使用其他方法,比如使用 bundleForClass:更为合适。
- 有时在某些特定情况下,这个方法可能会在私有库中返回资源文件路径。可能的情况之一是,私有库被添加到主项目中后,其资源文件被复制到主程序包的位置,从而使这种方式能够正常工作。但是,这并不是一个可靠的方法,因为它依赖于特定的项目结构和配置。
- 为了保证代码的可移植性和健壮性,建议在处理资源文件时使用更可靠的方法,如使用
bundleForClass:
方法来获取正确的 bundle,并从 bundle 中获取资源文件路径。这种方法更具通用性,适用于不同项目结构和配置的情况。
==========华丽分割线==========
以上bundleForClass:保证了 子工程正确获取了资源图片的路径。
还需注意:
1.图片和资源文件要在子工程的合理位置 : 比如和Classes 文件并列 建立一个 Resource 文件夹 资源都放在里面
2.图片和数据库资源要在KFZTechs.podspec 中体现
3.私有库提交代码时候打tag 需要是最新的tag 和 版本号
综上:要正确获取到子工程的图片 文件资源 需要
(1)bundleForClass:获取子工程bundle
(2)图片 文件资源 的Resource 放在与Classes并列位置
(3)图片和数据库资源要在KFZTechs.podspec 中体现
(4) 私有库提交代码时候打tag 需要是最新的tag 和 版本号
posted on 2023-08-09 11:00 ACM_Someone like you 阅读(258) 评论(0) 编辑 收藏 举报