创建Cocoapod库和[UIImage imageNamed:]返回NULL

时间:2014-09-14 17:13:28

标签: cocoa cocoa-touch ios8 xcode6 cocoapods

https://github.com/fulldecent/FDChessBoardView工作得非常好,我现在从头开始使用pod lib create再次启动项目以制作Podspec。

有一个{' .h'。'}文件和一些图片。图像位于提供的Pod / Assets文件夹中的文件系统中。 podspec文件中记录了资源:

s.resource_bundles = {
  'FDChessboardView' => ['Pod/Assets/*']
}

(我也尝试将这些文件直接添加到XCode中的Development Pods/FDChessboardView/Resources组中。)

在库实现文件中,我需要参考这些图像。我试过了:

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"FDChessboardView" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
NSString *imagePath = [bundle pathForResource:@"aa" ofType:@"png"];
UIImage* image = [UIImage imageWithContentsOfFile:imagePath];

这里正确设置了imagePath。此文件存在且file确认它是PNG:

  

[...] aa.png:PNG图像数据,182 x 164,8位/彩色RGBA,非隔行扫描

但是UIImage是NULL。

我也试过这些:

image = [UIImage imageNamed:@"aa"];
UIImage *image = [UIImage imageNamed:@"FDChessboardView.bundle/aa.png"];
image = [UIImage imageNamed:@"aa" inBundle:bundle compatibleWithTraitCollection:nil];

所有这些都会产生NULL。

任何人都可以帮我指出如何加载主题图片资源的正确方向吗?

谢谢!

威尔

4 个答案:

答案 0 :(得分:11)

好的 - 我找到了一个适合我的解决方案:

在我创建的lib中,我有以下课程:AEBubbleField.h AEBubbleView.m

我还在生成的文件结构的Assets文件夹中有一个名为background.png的图像。我想在上面的lib文件中使用它,所以我将以下内容添加到pod规范中(以确保png与我的lib类一起复制)

s.ios.resource_bundle = { 'AEBubbleField' => 'Pod/Assets/*.png' }

然后我可以通过以下方式访问图像:

NSBundle *bundle = [NSBundle bundleForClass:[self class]]; // Any class in the lib can be used here, I just went for the current class
UIImage *backgroundImage = [UIImage imageNamed:@"background.png" inBundle:bundle compatibleWithTraitCollection:nil];

这是我获取图像并使用它的唯一方法。我试过的所有其他方法只是像原始问题一样返回nil

答案 1 :(得分:2)

这个答案对我有用 https://stackoverflow.com/a/34324540/1897767

而且,我的快捷代码是:

class func loadImage(name: String) -> UIImage? {
    let podBundle = NSBundle(forClass: MyClass.self)
    if let url = podBundle.URLForResource("MyBundleName", withExtension: "bundle") {
        let bundle = NSBundle(URL: url)
        return UIImage(named: name, inBundle: bundle, compatibleWithTraitCollection: nil)
    }
    return nil
}

答案 2 :(得分:1)

如果您使用的是Swift 2>你可以这样访问:

// should access the bundle for this class
let bundle = NSBundle(forClass: self.classForCoder)
// successfully loaded image
let myImageToUse = UIImage(named: "image", inBundle: bundle, compatibleWithTraitCollection: nil)

答案 3 :(得分:0)

Rob的回答对我不起作用,我想是因为我没有从pod lib create

中的默认设置更改资源包设置
s.resource_bundles = {
  'PodCore' => ['Pod/Assets/*.png', 
                  'Pod/Classes/**/*.xib', 
                  'Pod/Classes/**/*.storyboard']
}

我能够从该资源包加载图像,但必须明确定义它。

NSString *bundleURL = [[NSBundle mainBundle] pathForResource:@"PodCore" 
                                                      ofType:@"bundle"];
NSBundle *podBundle = [NSBundle bundleWithPath:bundleURL];
UIImage *image = [UIImage imageNamed:@"home_black.png" 
                            inBundle:podBundle
       compatibleWithTraitCollection:nil];