访问bundle上的资源

时间:2013-04-09 17:33:51

标签: iphone ios ipad cocoa-touch cocoa

我已经创建了一个子项目作为静态库并添加了一个包,所以我可以包装将使用该库的所有程序使用的项目和资源。

我已按照此处的说明操作。 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]。

这创建了一个非常复杂的逻辑,因为我可能有多个子项目,我将不得不创建数以万计的变体。

有没有办法让应用程序可以使用简单的语法找到资源,或者我错过了什么?

1 个答案:

答案 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的另一种方法是让你的子项目共享资源文件的命名约定,基本上是扁平命名空间。例如,为每个资源文件添加与其关联的库的名称前缀。