5
votes

We're getting these kind of error messages:

Could not load the "iconStatus" image referenced from a nib in the bundle with identifier "com.company.OurResourceBundle".

Basically, we put a bunch of images in the xcassets folder ( which works for non-bundle loaded cases ). The xcassets and nib files are packed into a resource bundle.

When the app launches,

  1. uiimageview in the nib file cannot load any images with the above error message.
  2. [UIImage imageNamed:@"OurResourceBundle.bundle/iconStatus"] returns nil

The question is related to "How can I load an image from Assets.car (compiled version of xcassets) within an NSBundle?", but we don't use CocoaPods.

3
The answer is going to be essentially the same as for the question you reference. imageNamed: only loads from the main bundle, so you'll have to create a category that does all the right things to load your images from a different bundle.David Berry
I tried and it doesn't work. There is something special for xcassets being BundledTom Fishman
How do you get the compiled *.car file? From my short experience all *.xcassets images just get copied (with a proper name) flat inside the *.app directory.Rivera
I added the .xcassets (a folder in the harddrive) to the "Copy Bundle Resource" section for the Bundle target of the static library. Xcode build the .car file automatically in the bundle.Tom Fishman
This link might help : stackoverflow.com/questions/10998544/… Have you try something like:- [UIImage imageNamed:@"iconStatus"]; or [UIImage imageNamed:@"iconStatus.png"];Ricky

3 Answers

9
votes

In iOS 7 it is not possible to load images from any .car file aside from the one that Xcode compiles into the main bundle. This was confirmed by an Apple Developer at https://devforums.apple.com/message/968859#968859:

Unfortunately it is not possible to load images from any car file aside from the one that Xcode compiles into your main bundle, as +imageNamed: does not accept a bundle parameter, which is what is needed to do so (and even then it would only be able to open a single asset catalog in a single bundle).

In iOS 8 there is a new method that appears to do what you want:

+ (UIImage *)imageNamed:(NSString *)name inBundle:(NSBundle *)bundle
    compatibleWithTraitCollection:(UITraitCollection *)traitCollection
0
votes

you have to define your bundle

  imageView.image = UIImage(named: "iconName", in: Bundle.main, compatibleWith: nil)
-1
votes

I suspect if your image assets folder gets compressed into a .car file then NSBundle will know how to search for assets inside of it. Try creating a new bundle from your resources bundle. Then ask that bundle for the path of your image. Finally create an image from that path. This is sort of the approach we take when bundling image assets and localized strings with our static libraries. Our version is a little more involved as it takes care of things like @2x and ~ipad images automatically but this is the gist of it.

    NSBundle *myBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"your bundle" ofType:@"bundle"]];
    NSString *filePath = [myBundle pathForResource:@"icon" ofType:@"png"];
    UIImage *image = [UIImage imageWithContentsOfFile:filePath];