访问捆绑包上的资源[重复]

Posted

技术标签:

【中文标题】访问捆绑包上的资源[重复]【英文标题】:accessing resources on bundles [duplicate] 【发布时间】:2013-04-09 17:33:50 【问题描述】:

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

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

将您的资源访问分解为一个单独的类。例如,这样的事情可能对你有用:

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

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

【讨论】:

谢谢。如果我理解正确,我不确定这是如何解决问题的,因为我必须为我拥有的每个带有捆绑包的库都使用这样的方法,这将是疯狂的。 那么,您可能必须更具体地说明您要做什么。当您查找资源时,您希望其行为是什么?您如何决定要查询哪个库包? 这是我的问题。我不想查询任何捆绑包。我可能有 3 个或更多捆绑包,更不用说主要捆绑包了。每个包都可能必须访问主包上的东西,反之亦然。我想要的是:“在任何地方加载图像”。我希望所有捆绑包对应用程序都是透明的。 见上面我更新的代码。我的解决方案将捆绑包转换为实现细节,并允许您搜索资源,无论您想要什么/任何地方。 好的,我会接受你的代码。我认为这是 iOS 的限制,我没有看到另一种更好的方法来做到这一点。谢谢!

以上是关于访问捆绑包上的资源[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Retina 图形未从 NSBundle 加载

如何在供应商捆绑包上使用 babel 的 `useBuiltIns: 'usage'` 选项?

Android:是不是创建捆绑包[重复]

错误捆绑安装-“mysql2”[重复]

我可以稍后更改捆绑标识符吗[重复]

从捆绑中获取图像到数组中[重复]