我已经创建了一个子项目作为静态库并添加了一个包,所以我可以包装将使用该库的所有程序使用的项目和资源。
我已按照此处的说明操作。 http://www.galloway.me.uk/tutorials/ios-library-with-resources/
它工作正常,除非我必须处理图像和其他文件等资源。
我认为通过将库及其资源导入另一个项目,我可以轻松访问它们,但事实并非如此。
每次我必须访问库捆绑包上的资源文件时,我必须使用它:
NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"MyLibraryBundle" withExtension:@"bundle"]];
path = [bundle pathForResource:@"readme" ofType:"txt"];
但如果资源在主程序上,我必须使用[NSBundle mainBundle]。
这创建了一个非常复杂的逻辑,因为我可能有多个子项目,我将不得不创建数以万计的变体。
有没有办法让应用程序可以使用简单的语法找到资源,或者我错过了什么?
答案 0 :(得分:0)
将您的资源访问因素分解为一个单独的类。例如,像这样的东西可能适合你:
@interface CSResourceManager
+ (NSString *)pathForResource:(NSString *)resource ofType:(NSString *)type;
@end
@implementation CSResourceManager
+ (NSArray *)resourceBundles
{
NSBundle *mainBundle = [NSBundle mainBundle];
NSURL *libraryBundleURL = [mainBundle URLForResource:@"MyLibraryBundle" withExtension:@"bundle"];
NSBundle *libraryBundle = [NSBundle bundleWithURL:libraryBundleURL];
// Add more bundles here and/or cache as necessary
return @[ libraryBundle, mainBundle ];
}
+ (NSString *)pathForResource:(NSString *)resource ofType:(NSString *)type
{
NSString *path = nil;
for (NSBundle *bundle in [self resourceBundles]) {
if ((path = [[self resourceBundle] pathForResource:resource ofType:type])) {
break;
}
}
return path;
}
@end
如果每次定位资源包太慢,您可能想要缓存它,即使用静态变量。
要使用此功能,您现在只需编写:
NSString *path = [CSResourceManager pathForResource:@"readme" ofType:@"txt"];
除了使代码更容易编写之外,使用这样的类还可以使维护更容易(例如,如果要更改资源包的名称,添加其他资源存储位置或回退等, )。
更新#1 :请参阅上面修改后的代码,以支持用于查找资源的“搜索路径”。
更新#2 :管理资源的其他想法:
使用bundle的另一种方法是让你的子项目共享资源文件的命名约定,基本上是扁平命名空间。例如,为每个资源文件添加与其关联的库的名称前缀。