UIImage imageNamed devuelve cero

Soy bastante nuevo en iOS y Xcode.

Intenté cargar una imagen con

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

pero solo devuelve cero. La imagen debe estar en mi paquete de proyecto, considerando el hecho de que puedo elegirla de los menús de arrastrar y soltar en InterfaceBuilder y se agregó a Xcode a través del menú "Agregar archivos a" nombre del proyecto "...".

No importa si uso imágenes .png o .jpg, el resultado sigue siendo el mismo: funcionan a través de IB pero no si trato de ejecutar el método imageNamed yo mismo.

preguntado el 12 de junio de 12 a las 15:06

Seleccione el archivo y abra el panel Inspector de archivos a la derecha. Asegúrese de que haya una marca de verificación junto a su objetivo. -

¿Ya intentaste limpiar tu proyecto? Shift-Apple-K es el comando. esa parecía ser la razón principal por la que perdí imágenes. -

Ya intenté limpiar como mi primera idea. No puedo encontrar ninguna marca de verificación en el Inspector de archivos, ¿dónde debería estar exactamente? -

ah, ahora sé lo que Mike Weller quiso decir: sí, hay una marca de verificación junto a mi proyecto -

¿Puedes editar la pregunta y poner el código exacto que estás usando para obtener la imagen, por favor? -

20 Respuestas

Solo hay algunas razones por las que una imagen volvería nula con imageNamed:

  • La imagen no está en su paquete. Asegúrese de que la imagen esté realmente en su proyecto. Asegúrese de que el objetivo esté marcado haciendo clic en el archivo y seleccionando el objetivo al que pertenece.

  • Tienes el nombre de la imagen mal escrito o hay un problema con la extensión.

  • Está utilizando una pantalla retina pero no tiene una imagen @2x. Intente cambiar su simulador a retina y vea si aparece.

  • Si está utilizando un catálogo de activos, asegúrese de tener los dispositivos correctos seleccionados en el inspector de atributos.

Algunos consejos:

Si está probando con el simulador, elimine la aplicación de su simulador y limpie su proyecto, luego vuelva a ejecutar. Si aún aparece, debería aparecer en su teléfono (si no es así, probablemente sea un problema con el caso del nombre de archivo o la versión @2x).

Si está probando en su teléfono y no aparece, asegúrese de estar usando la misma versión del simulador (si tiene un iPhone 4/4s, asegúrese de usar el simulador 4/4s con retina).

Una última cosa según este post: La imagen JPG no se carga con UIImage imageNamed Hay algún problema con ciertos tipos de JPG que funcionan con imageNamed y sin extensión. En mi opinión, debería usar PNG de todos modos ya que iOS los comprime por usted, a menos que solo tenga que usar JPG.

Respondido el 03 de enero de 19 a las 22:01

Lamento mi respuesta tardía: estaba enfermo y acabo de regresar al trabajo hoy. ¡Intenté reescribir y compilar el código y de repente funcionó! Todavía no estoy exactamente seguro de por qué lo hace o no lo hizo antes, ¡pero muchas gracias por toda la ayuda! - arne somborn

Tuve que eliminar la aplicación, pero eso por sí solo no solucionó el problema. Después de hacer el producto -> limpiar, pude ver las imágenes correctas: ariaxt

¡Tienes 100% razón! Tuve el mismo problema y fue porque no tenía el archivo @2x. - Hola Soy Edu Feliz Navidad

no he tenido ninguna .jpg archivos en mi paquete como... ¿alguna vez? Copié uno con fines de prueba, perdí prolijamente media hora preguntándome por qué mi imagen no se cargaba. Voto positivo por mencionar el .jpg problema de extensión, aunque lo descubrí yo mismo. - justicia

Parece que iOS 7 tiene un problema con las imágenes JPG mientras que iOS 8 no, así que me pasó a mí y lo arreglé convirtiendo las imágenes en PNG - Boda

Sobre el comentario de Mike Weller. La casilla de verificación es....

enter image description here

Respondido el 12 de junio de 12 a las 15:06

Muchas gracias, lo encontré yo mismo después de releer el comentario. Sin embargo, se verifica y, lamentablemente, no cambia el comportamiento. - arne somborn

En mi caso, el PNG estaba mal formado.

Por alguna razón, la vista previa de Xcode lo mostró correctamente, pero cuando intenté cargarlo con UIImage, devolvió cero.

Respondido 06 Feb 13, 20:02

¡Me salvas el día! Me encontré con una situación similar al cambiar la extensión del archivo de imagen de .psd a .png y esperaba que funcionara como un archivo png adecuado. De alguna manera, Xcode me permite obtener una vista previa de la imagen correctamente. Eso es malo. Philip007

Acabo de tener el mismo problema. El archivo original era un JPEG que se volvió a guardar como PNG. En el simulador funcionó bien, pero en un dispositivo real, la imagen siempre devolvería cero. - psobko

¡¡Gracias!! Algo en este sentido fue el problema para mí. No diría mal formado para mi caso, ya que la imagen es realmente un PNG y se usa en cualquier otro lugar (Android nativo, escritorio multiplataforma, escritorio y web móvil, incluido iOS Safari) sin problemas, pero UIImage siguió volviendo cero. Lo abrí en Photoshop y luego lo exporté como PNG sobrescribiendo el archivo en cuestión y ahora funciona. Simplemente absurdo. - gato

Si verificó todo lo anterior y encuentra que su UIImage (llamado: "myImage") devuelve cero desde el código dentro de un marco dinámico que está construyendo, entonces tienes que cambiar el código a:

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

Esto debería recuperar el activo de CXAssets correctamente.

respondido 23 mar '17, 21:03

Esto me salvó el día al tratar con marcos dinámicos. Agregué un método de clase para facilitar la recuperación del paquete: +(NSBundle*)currentBundle { static dispatch_once_t predicate = 0; static NSBundle *myBundle = nil; dispatch_once(&predicate, ^{ myBundle = [NSBundle bundleWithIdentifier:@"yourbundle.identifier"]; }); return myBundle; } - Lookaji

¿Es posible cargar una imagen como esta desde Interface Builder? - Eduard

Cuando se usaba un marco compilado dentro de otro proyecto en Xcode, esta era la única manera de hacer que la imagen se cargara cuando se llamaba desde dentro del marco. - Locutus

Acabo de tener este problema con los archivos jpg llamados en el disco "archivo.jpg"

Estaba tratando de cargar sin la extensión, solo @"archivo". Si bien esto funciona bien para png, no funciona para jpg. Una vez que usé @"file.jpg", ¡funcionó!

Respondido el 11 de Septiembre de 14 a las 20:09

Swift 5

Si obtiene UIImage nulo en el marco dinámico, debe configurar la imagen con el identificador de paquete.

Puede crear una extensión para Bundle como esta;

  • Crear una extensión;

    extension Bundle {
        public static let myFramework = Bundle(identifier: "com.myFramework.bundle")
    }
    
  • Entonces puedes usar así;

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

Or

Puedes usarlo así;

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

Creo que el primero es más útil porque es más legible que el segundo.

Respondido 28 Feb 20, 05:02

Intenta volver a exportar tu imagen.

Tuve un problema similar, UIImage imageNamed devolvía cero y ninguna de estas respuestas solucionó mi problema.

Descubrí que en realidad había algo mal con el archivo png. Abrí el archivo en el editor de imágenes GIMP, lo guardé como un archivo nuevo, lo exporté nuevamente como png y mágicamente comenzó a funcionar.

No cambié nada en el código, así que definitivamente había algo mal con el archivo de imagen real.

Respondido 26 ago 13, 06:08

Sigo teniendo el problema contrario, donde si exporto con GIMP no funciona. Pero si lo exporto con algo más, puedo hacerlo funcionar. - chase roberts

tratan

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

en cambio (con una extensión)

Respondido el 12 de junio de 12 a las 15:06

@Mike Weller: antes de iOS 4, debe especificar la extensión del nombre de archivo. - iMx

en defensa de iMx: no mencioné intentarlo cuando publiqué la pregunta por primera vez, pensé que sería demasiado obvio;) - arne somborn

@arnesomborn hay algunas razones posibles: aquí - iMx

Tuve el mismo problema: @"photo.jpg" resultó en UIImage 'nil'. ¡Cambiar a la especificación de archivo "real", @"photo.JPG" funciona bien! ¡No me había dado cuenta de que había distinción entre mayúsculas y minúsculas allí! MUY poco intuitivo.

contestado el 14 de mayo de 13 a las 04:05

tuve un problema similar, finalmente la limpieza lo solucionó: la imagen aparecía en el simulador, pero la identificación no aparecía al ejecutar la aplicación en el iPhone.
Lo que hice: 1) eliminé la aplicación del iPhone 2) realicé Product/Clean después de eso, se solucionó el error y apareció la imagen.

respondido 01 nov., 13:17

Tratar de usar UIImage(contentsOfFile:) en lugar de imageNamed. Funcionó para mí con imágenes descargadas.

Respondido el 11 de Septiembre de 15 a las 06:09

Compruebe que el archivo no tiene espacio al final. El nombre como name @2x.png fallará al cargar, pero name@2x.png está bien

respondido 04 mar '16, 13:03

¿La imagen funciona en el simulador pero no en el dispositivo?

Si es así, en este escenario es siempre que ver con el caso del nombre. El dispositivo requiere el caso exacto y el simulador no es tan quisquilloso si no recuerdo mal.

por ejemplo, para una imagen llamada image.png

[UIImage imageNamed:@"Image"];

funcionaría en el simulador pero no en el dispositivo...

Respondido el 12 de junio de 12 a las 15:06

Eso no se debe a que el simulador sea menos confuso, sino a que, de forma predeterminada, HFS+ (el sistema de archivos de OS X) no distingue entre mayúsculas y minúsculas. Eso significa que considera aa, AA, aAy Aa ser el mismo archivo. Puede formatear un HD nuevo con HFS+ y decidir si distingue entre mayúsculas y minúsculas (Disk Utility le da esa opción), pero las Mac vienen con un HD preformateado que nunca distingue entre mayúsculas y minúsculas. Muchos programadores de Mac no prestan atención y luego su aplicación falla en las Mac cuyo propietario reformateó su HD para distinguir entre mayúsculas y minúsculas; lo cual es posible si reinstala su sistema desde cero. - mecki

Asegúrese de tener la imagen del DISPOSITIVO que está utilizando en su archivo .xcassets. Una imagen marcada para iPad no aparecerá en el teléfono (o en el teléfono simulado).

Respondido 29 ago 14, 00:08

Además de la respuesta de @Inturbidus: Para los que vinieron aquí trabajando en Extensiones de aplicación:

La imagen con la que está trabajando debe pertenecer a ambas objetivos: aplicación alojada y extensión.

En otro caso, siempre obtendrá nil tratando de acceder desde dentro del código de la extensión.

Respondido el 02 de Septiembre de 15 a las 10:09

Para Xcode 6.4, haga clic en Images.xcassets y verifique si hay entradas para cada imagen que llamó. Puede hacer clic derecho en la imagen y seleccionar "Mostrar en Finder" para verificar si las imágenes son las correctas agregadas.

Respondido el 11 de Septiembre de 15 a las 19:09

Asegúrese de que el campo de nombre del inspector de atributos de la imagen coincida exactamente con el nombre que está utilizando. En mi caso, la imagen era parte de una carpeta, por lo que el nombre de la imagen era "carpeta/nombre". Usar este nombre largo resolvió el problema. XCode 7.3.1

Respondido el 06 de Septiembre de 16 a las 22:09

En mi caso, usar un nombre con caracteres acentuados resultó ser una mala idea. Cambié Astéroïdes a Asteroids y funcionó bien.

Respondido 24 Abr '17, 14:04

En mi caso, el problema fue con el nombre de la imagen en el catálogo de activos. Por ejemplo, si tiene una imagen con el nombre "PRUEBA" y cambia el nombre a "Prueba", los cambios no se indexarán. Si su compañero de equipo se compromete con estos cambios, la imagen en su catálogo de activos tendrá el nombre anterior "PRUEBA". Muy poca posibilidad de atrapar esta situación, pero es posible.

Respondido el 24 de enero de 20 a las 12:01

Tenía varios .xcassets en mis proyectos y 2 tenían nombres de imágenes duplicados. Entonces no estaba cargando la imagen en mi caso.

Respondido 10 Feb 20, 05:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.