访问pod中的资源

时间:2014-09-12 22:24:44

标签: ios xcode uiimage cocoapods resourcebundle

我想在cocoapod库中包含图片资源,但我无法访问它们。我已经阅读了这些资源以寻求帮助:

Cocoapods Resources

Cocoapods Resource Bundles

Mokacoding Resource Bundles

David Potter Resource Bundles

然而,没有人指出我访问资源的方向。我尝试过以下方法:

[UIImage imageWithData:[NSData dataWithContentsOfURL:[(NSBundle *)[NSBundle bundleWithIdentifier:@"Assets"] URLForResource:@"my-image@2x" withExtension:@"png"]]]
[UIImage imageWithData:[NSData dataWithContentsOfURL:[(NSBundle *)[NSBundle bundleWithIdentifier:@"Assets"] URLForResource:@"my-image" withExtension:@"png"]]]
[UIImage imageWithData:[NSData dataWithContentsOfURL:[(NSBundle *)[NSBundle bundleWithIdentifier:@"Assets.bundle"] URLForResource:@"my-image" withExtension:@"png"]]]
[UIImage imageWithData:[NSData dataWithContentsOfURL:[(NSBundle *)[NSBundle mainBundle] URLForResource:@"my-image" withExtension:@"png"]]]
[[UIImage imageWithData:[NSData dataWithContentsOfURL:[(NSBundle *)[NSBundle mainBundle] URLForResource:@"my-image@2x" withExtension:@"png"]]]
[UIImage imageNamed:@"my-asset"]
[UIImage imageNamed:@"my-asset@2x.png"]

但它们都不起作用。

我已经使用这些替代方案设置了podspec,但都没有使用上述内容:

s.resources = ['Pod/Assets/*.{png, jpg}', 'Pod/Assets/**/*.{png, jpg}']
s.resource_bundles = {
    'Assets' => ['Pod/Assets/*.{png, jpg}', 'Pod/Assets/**/*.{png, jpg}']
}

资源显示在'开发窗口/我的应用程序/资源'在pod update之后,但我无法访问它们。没有任何捆绑包,也没有任何名称'资产'。

任何帮助或指导都将不胜感激。

2 个答案:

答案 0 :(得分:9)

这取决于您使用的Cocoapods的版本。使用旧版本的cocoapods,你可以使用[NSBundle mainBundle]:pathForResource:ofType:

NSString *bundlePath = [[NSBundle mainBundle] 
    pathForResource:@"MyResourceBundle" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];

如果您在podspec文件中使用较新的Cocoapods并使用spec.resource_bundles而不是spec.resources,则必须避免使用mainBundle并将其替换为NSBundle bundleForClass,其中" Returns the NSBundle object with which the specified class is associated"

示例:

NSString *bundlePath = [[NSBundle bundleForClass:[MyFrameworkClass class]] 
    pathForResource:@"MyResourceBundle" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];

答案 1 :(得分:5)

这也使我绊倒了。也许我误解了+bundleWithIdentifier:,但我认为你不能用它来获取iOS应用包内的资源包。有关详细信息,请参阅捆绑文档的"Getting Bundles by Identifier"部分。

工作是+bundleWithPath:,例如:

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"MyResourceBundle" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];

我将其包装在dispatch_once块内,并在我需要访问此捆绑包时调用它。

我也在我的podspec中使用s.resource_bundles语法,这可以正常使用。