Error: CUICatalog: Nombre de activo no válido proporcionado: (nulo), o factor de escala no válido: 2.000000


120
TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000

Captura de pantalla agregada

Recibiendo esta advertencia mientras trabaja con TableViewController. ¿Cómo subsanar este error y qué bloque se ve afectado?


¿Puedes publicar algún código?
Patrick Hofman

2
Esta advertencia también aparece si el nombre de la imagen es una cadena vacía
onmyway133

Respuestas:


242

Éste aparece cuando alguien está tratando de poner nilen[UIImage imageNamed:]

Agregue un punto de interrupción simbólico para [UIImage imageNamed:]Ejemplo de punto de interrupción simbólico

Agregue $arg3 == nilcondición en el simulador, $r0 == nilcondición en iPhone de 32 bits o $x2 == nilen iPhone de 64 bits.

Ejecute su aplicación y vea dónde se detendrá el depurador.

PD: Tenga en cuenta que esto también sucede si el nombre de la imagen es una cadena vacía. Puede verificar esto agregando [(NSString*)$x2 length] == 0a la condición.


7
Este es un enfoque inteligente. Parece que mi imagen nula está en algún lugar de mi plumilla, por lo que no está pasando UIImage imageNamed:, pero de todos modos estoy guardando este punto de interrupción.
cbowns

9
No conocía la $arg3sintaxis de los puntos de interrupción condicionales. ¿Dónde puedo aprender más?
Zev Eisenberg

3
No estoy seguro de entender por qué no funciona para mí, siempre regresando error: use of undeclared identifier '$arg3'. ¿Me he perdido algo?
Ben

5
sigo recibiendo: Detenido debido a un error al evaluar la condición del punto de interrupción 23.1: "$ r0 == nil" No se pudo analizar la expresión condicional: error: uso del identificador no declarado '$ r0' error: 1 errores al analizar la expresión
Pranoy C

8
En mi caso, la cadena del nombre de la imagen estaba vacía, por lo que verificar la longitud de arg3 funcionó para mí. (int)[$arg3 length] == 0
Matthew Korporaal

62

Este error (por lo general) ocurre cuando intenta cargar una imagen con [UIImage imageNamed:myImage]pero iOS no está seguro de si myImagees realmente una NSStringy luego aparece esta advertencia.

Puedes arreglar esto usando:

[UIImage imageNamed:[NSString stringWithFormat:@"%@", myImage]]

O simplemente puede buscar lengthel nombre del UIImage:

if (myImage && [myImage length]) {

    [UIImage imageNamed:myImage];
}

1
En caso de que alguien cometiera el mismo error que yo, estaba intentando actualizar la imagen de fondo de un UIButton para eliminarla (sin ninguna imagen), así que cambié mi nombre de UIImage de una cadena a sólo "", lo que provocó el error. Al eliminar todo el UIImage (llamado: "") y reemplazarlo con nil, el error desapareció.
Dave G

@DaveG Usted señor, me salvó horas. ¡Gracias por el comentario!
Jeff

22

Dado que el error es quejarse de que el nombre que dio es (null), lo más probable es que esto se deba a la llamada [UIImage imageNamed:nil]. O más específicamente, no se ha establecido pasar una variable, por lo que es igual a nil. Si bien el uso stringWithFormat:eliminaría el error, creo que es muy probable que no esté haciendo lo que quieres. Si el nombre que proporcionas es un nilvalor, entonces el uso de stringWithFormat: daría como resultado la búsqueda de una imagen que se llama literalmente "(nulo)", como si estuvieras llamando [UIImage imageNamed:@"(null)"].

Algo como esto es probablemente una mejor opción:

if (name) {
    UIImage *image = [UIImage imageNamed:name];
} else {
    // Do something else
}

Es posible que desee establecer un punto de interrupción en Xcode en esa línea "Hacer algo más", para ayudarlo a descubrir por qué este código se llama con un valor nulo en primer lugar.


1
Tuve el mismo problema y el error fue que el nombre de la imagen era nulo, como dice robotspacer.
diegomen

17

En Xcode 6.4, esto parece ocurrir cuando se usa "Imagen seleccionada" para un elemento de la barra de pestañas en el guión gráfico, incluso si es una imagen válida.

ingrese la descripción de la imagen aquí

En realidad, esto no parece establecer la imagen de estado seleccionada de todos modos, por lo que debe definirse en Atributos de tiempo de ejecución definidos por el usuario y eliminarse del atributo Imagen seleccionada del elemento de la barra de pestañas

ingrese la descripción de la imagen aquí


1
¡Gracias por eso! ¡Estos mensajes de error / advertencia me estaban volviendo loco! No puedo entender por qué Apple no se deshace del menú desplegable "Imagen seleccionada" del elemento de la barra de pestañas en IB o no lo corrige para que funcione correctamente.
wcochran

4

En mi caso, estaba pasando [UIImage imageNamed: @ ""], lo que me hizo mostrar la advertencia. Simplemente agregue puntos de interrupción a todas las líneas donde ha usado imageNamed y depure la línea donde encuentra la advertencia.


También estoy usando [UIImage imageNamed:@""]. ¿Cómo lo arreglaste?
Julfikar

[aButton setImage: nil forState: UIControlStateNormal]
Hahnemann

Aparte de usar un ifpara probar si el nombre de la imagen no es una cadena vacía, o usar una imagen "noImage" predeterminada, ¿cómo no muestra ninguna imagen cuando no se aplica ningún nombre aplicable y los Activos no contienen una imagen "noImage"?
desapareció el

2

Esto me sucedió después de que un guión gráfico se dividiera en varios (el cambio real ocurrió cuando estaba de vacaciones, así que no sé exactamente cómo se hizo).

Después de inspeccionar el XML de los guiones gráficos, encontré que una referencia de imagen que anteriormente había apuntado a "bottomBar" en el catálogo de activos en su lugar apuntaba a imageView:fFo-1g-jzs:image.

Al final del archivo XML, debajo de la <resources>etiqueta, se nombró <image name="imageView:fFo-1g-jzs:image">una etiqueta que contiene una gran mutableDatamancha.

Después de restablecer la referencia de la imagen en el guión gráfico y eliminar el blob, el error desapareció.


Esto me resolvió, he estado buscando este problema por un tiempo, me volvió loco. El schtick del punto de interrupción no funcionó para mí.
Moshe Gottlieb

El mismo problema aquí, pero el punto de interrupción me ayudó a encontrar el xib en el que estaba. El nombre de la imagen era Imagen desconocida en IB.
Josh Bernfeld

1

Acabo de arreglar este error. Simplemente verifique el uso de la [UIImage imageNamed:(NSString*) imageName]función. Si imageNamees así nil, se produce un error.


1

Está proporcionando un nombre de imagen no válido, por lo que debe validarlo antes de colocarlo, puede hacer cualquiera de las formas anteriores, lo que tenga sentido para su código o me gusta

if (iconImageName && [iconImageName length])
{

    [UIImage imageNamed:iconImageName];
}
else
{
     iconImageName.hidden = YES;
}

¡Espero que te ayude!


0

La razón del error es pasar un valor nulo al método "imageNamed:". Para evitar esto, puede ocultar su imageView cuando intente pasar el valor nulo. Las posibilidades pueden ocurrir al reutilizar imageViews en UITableView o pueden estar en scrollViews.

Evité la advertencia con la siguiente verificación:

UIImageView *your_image_view;
NSString *imageName;
if(imageName && imageName.length){
 your_image_view.hidden = NO;
 your_image_view.image = [UIImage imageNamed:imageName];
}
else {
 your_image_view.hidden = YES;
}

0

Recibí esta advertencia cuando cargo el uso de la imagen [[UIImage imageNamed:normalStr] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal], luego, cambio a [UIImage imageNamed:normalStr], la advertencia desapareció.


0

Un enfoque es hacer swizzling del método de clase para reemplazarlo [UIImage imageNamed:]con su propia implementación, luego verifique el nombre de la imagen en su implementación. Vea lo siguiente:

¿Cómo cambiar un método de clase en iOS?

Implementé esto en mi categoría UIImage (Debug):

+ (UIImage *)db_imageNamed:(NSString *)imageName {
    if ([imageName length] == 0) {
        NSLog(@"breakpoint here");
    }
    return [self db_imageNamed:imageName];  // not a recursive call here after swizzling
}

Es posible que también desee swizzle [UIImage imageNamed:inBundle:compatibleWithTraitCollection:].


-1

Tal vez puedas usar esto para confirmar que "imageName" no es un "nulo", entonces dejarás de lado esta advertencia.

 if (imageName) {
    self.imageView.image = [UIImage imageNamed:imageName];
 }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.