UIImage imageNamed returns nil

IosXcodeUiimageImagenamed

Ios Problem Overview


I am pretty new to iOS and Xcode.

I tried to load an image with

[UIImage imageNamed:@"imageName.png/jpg and so on"];

but it only returns nil. The image should be in my project bundle, considering the fact that I can choose it from drag and drop menus in the InterfaceBuilder and it was added to Xcode via the "Add files to "projectname"..." menu.

It makes no difference whether I use .png or .jpg images, the result stays the same: they work via IB but not if I try to run the imageNamed method myself.

Ios Solutions


Solution 1 - Ios

There are only a few reasons why an image would come back nil with imageNamed:

  • The image is not in your bundle. Make sure the image is actually in your project. Make sure the target is checked by clicking on the file and selecting the target it belongs to.

  • You have the image name spelled incorrectly or a problem with the extension.

  • You are using a retina display but do not have an @2x image. Try changing your simulator to retina and see if it shows up.

  • If you are using an asset catalog make sure you have the correct devices selected in the attribute inspector.

Some tips:

If you are testing using simulator delete the app off of your simulator and clean your project, then re-run. If it still shows up it should show up on your phone (if it doesn't it's probably an issue with the case of the filename or the @2x version).

If you are testing on your phone and it doesn't show up, make sure you are using the same version of the simulator (if you have an iPhone 4/4s make sure to use the 4/4s simulator with retina).

One last thing according to this post: https://stackoverflow.com/questions/7148874/jpg-problem-with-uiimage-imagenamed-method There is some issue with certain JPG types working with imageNamed and no extension. IMO, you should be using PNGs anyway since iOS compresses them for you, unless you just have to use JPG.

Solution 2 - Ios

Re Mike Weller's comment. The checkbox is ....

enter image description here

Solution 3 - Ios

In my case, the PNG was malformed.

For some reason Xcode preview shown it correctly, but when I tried loading it with UIImage, it returned nil.

Solution 4 - Ios

If you verified all of the above and are finding that your UIImage(named: "myImage") returns nil from code inside of a dynamic framework you are building, then you have to change the code to:

UIImage(named: "myImage", in: Bundle(identifier: "com.myframework.name"), compatibleWith: nil)

This should retrieve the asset from CXAssets correctly.

Solution 5 - Ios

I just had this issue for jpg files named on disk "file.jpg"

I was trying to load without the extension, just @"file". While this works fine for pngs, it does not for jpg. Once I used @"file.jpg", it worked!

Solution 6 - Ios

Swift 5

If you get UIImage nil in dynamic framework, you should set image with bundle identifier.

You can create an extension to Bundle like this;

  • Create an extension;

      extension Bundle {
          public static let myFramework = Bundle(identifier: "com.myFramework.bundle")
      }
    
  • Then you can use like this;

      UIImage(named: "myImageName", in: Bundle.myFramework, compatibleWith: nil)
    

Or

You can use like this;

UIImage(named: "myImageName", in: Bundle(for: type(of: self)), compatibleWith: nil)

I think the first one is more useful because it's more readable than second one.

Solution 7 - Ios

Try re-exporting your image.

I had a similar problem, UIImage imageNamed was returning nil and none of these answers fixed my problem.

I found out that it was actually something wrong with the png file. I opened the file in GIMP image editor, saved it as a new file, exported it again as png and magically it started working.

I didn't change anything in code at all so there was definitely something wrong with the actual image file.

Solution 8 - Ios

try

[UIImage imageNamed:@"imageName.png"];

instead (with an extension)

Solution 9 - Ios

I had the same problem: @"photo.jpg" resulted in 'nil' UIImage. Changing to the "actual" filespec, @"photo.JPG" works fine! I hadn't realized there was case-sensitivity there! VERY non-intuitive.

Solution 10 - Ios

i had a similar issue, finally the cleanup fixed it: the image showed up in the simulator, but id did not show up when running the app on the iPhone.
What I did:

  1. deleted the app from the iPhone
  2. performed Product/Clean after that the bug was fixed and the image showed up!

Solution 11 - Ios

Try to use UIImage(contentsOfFile:) instead of imageNamed. It worked for me with downloaded images.

Solution 12 - Ios

Check that file has no space at the end. The name like name @2x.png will fail loading, but [email protected] is fine

Solution 13 - Ios

Does the image work on the simulator but not on the device?

If so, in this scenario it is always to do with the case of the name. The device requires exact case and the simulator is not so fussy if I remember correctly.

e.g. for an image named image.png

[UIImage imageNamed:@"Image"];

would work on the simulator but not on the device...

Solution 14 - Ios

Make sure you have the image for the DEVICE you are using in your .xcassets file. An image flagged for iPad won't show up on the phone (or the simulated phone).

Solution 15 - Ios

In addition to @Inturbidus's answer: For those who came here working on Application Extensions:

The image you are working with should belongs to both targets - hosted app and extension.

In other case you'll always getting nil trying to access it from within the extension's code.

Solution 16 - Ios

For Xcode 6.4, click on Images.xcassets and check whether there are entries for each image that you called. You may right-click on the image and select "Show in Finder" to check if the images are the correct ones added.

Solution 17 - Ios

Make sure the Attributes Inspector name field of the image matches exactly the name you're using. In my case the image was part of a folder and so the image name was "folder/name". Using this long name solved the problem. XCode 7.3.1

Solution 18 - Ios

In my case, using a name with accented characters proved to be a poor idea. I changed Astéroïdes to Asteroids and it worked fine.

Solution 19 - Ios

In my case problem was with image name in asset catalog. For example if you have image with name "TEst" and change name to "Test", changes won't be indexed. If your teammate will pull commit with this changes, image in his asset catalog will have previous name "TEst". Very small chance to catch this situation but it's possible.

Solution 20 - Ios

I had multiple .xcassets in my projects and 2 had duplicate name of images. So it was not loading the image in my case.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionarne sombornView Question on Stackoverflow
Solution 1 - IosMatt HudsonView Answer on Stackoverflow
Solution 2 - IosDamoView Answer on Stackoverflow
Solution 3 - IosKofView Answer on Stackoverflow
Solution 4 - IosTravis M.View Answer on Stackoverflow
Solution 5 - IosclocksmithView Answer on Stackoverflow
Solution 6 - IosemrcftciView Answer on Stackoverflow
Solution 7 - IosKageView Answer on Stackoverflow
Solution 8 - IosiMxView Answer on Stackoverflow
Solution 9 - IosJimView Answer on Stackoverflow
Solution 10 - IosiHuxView Answer on Stackoverflow
Solution 11 - Iossuperarts.orgView Answer on Stackoverflow
Solution 12 - IosakaDualityView Answer on Stackoverflow
Solution 13 - IosDamoView Answer on Stackoverflow
Solution 14 - IosVentureView Answer on Stackoverflow
Solution 15 - IosslxlView Answer on Stackoverflow
Solution 16 - IosArunabh DasView Answer on Stackoverflow
Solution 17 - IosandrewzView Answer on Stackoverflow
Solution 18 - IosHuibertView Answer on Stackoverflow
Solution 19 - IosHot'n'YoungView Answer on Stackoverflow
Solution 20 - Iosuser1039695View Answer on Stackoverflow