0

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

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

这是一个非常复杂的逻辑,因为我可能有不止一个子项目,而且我将不得不创建数以千计的变体。

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

4

1 回答 1

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:管理资源的其他想法:

完全使用捆绑包的替代方法是让您的子项目共享资源文件的命名约定,本质上是扁平化命名空间。例如,在每个资源文件前面加上与之关联的库的名称。

于 2013-04-09T17:56:34.280 回答