Erreur: CUICatalog: nom d'actif non valide fourni: (nul) ou facteur d'échelle non valide: 2.000000

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

Capture d'écran ajoutée

Obtention de cet avertissement lors de l'utilisation de TableViewController. Comment corriger cette erreur et quel bloc est affecté?

manish singh
la source
Pouvez-vous publier du code?
Patrick Hofman
2
Cet avertissement apparaît également si le nom de l'image est une chaîne vide
onmyway133

Réponses:

242

Celui-ci apparaît quand quelqu'un essaie de mettre nil en[UIImage imageNamed:]

Ajouter un point d'arrêt symbolique pour [UIImage imageNamed:]Exemple de point d'arrêt symbolique

Ajouter une $arg3 == nilcondition sur le simulateur,$r0 == nil condition sur un iPhone 32 bits ou$x2 == nil sur un iPhone 64 bits.

Exécutez votre application et voyez où le débogueur s'arrêtera.

PS Gardez à l'esprit que cela se produit également si le nom de l'image est une chaîne vide. Vous pouvez vérifier cela en ajoutant [(NSString*)$x2 length] == 0à la condition.

tt.Kilew
la source
7
C'est une approche intelligente. Il semble que mon image nulle se trouve quelque part dans ma plume, donc elle ne passe pas UIImage imageNamed:, mais j'enregistre néanmoins ce point d'arrêt.
cbowns
9
Je ne connaissais pas la $arg3syntaxe des points d'arrêt conditionnels. Où puis-je en savoir plus?
Zev Eisenberg
3
Je ne sais pas pourquoi cela ne fonctionne pas pour moi, je reviens toujours error: use of undeclared identifier '$arg3'. Ai-je oublié quelque chose?
Ben
5
Je continue à obtenir: Arrêté en raison d'une erreur lors de l'évaluation de la condition du point d'arrêt 23.1: "$ r0 == nil" Impossible d'analyser l'expression conditionnelle: erreur: utilisation de l'identificateur non déclaré '$ r0' erreur: 1 erreurs d'analyse de l'expression
Pranoy C
8
Dans mon cas, la chaîne du nom de l'image était vide, donc vérifier la longueur de arg3 a fonctionné pour moi. (int)[$arg3 length] == 0
Matthew Korporaal
62

Cette erreur se produit (généralement) lorsque vous essayez de charger une image avec [UIImage imageNamed:myImage]mais iOS ne sait pas si myImagec'est vraiment un NSStringet vous avez cet avertissement.

Vous pouvez résoudre ce problème en utilisant:

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

Ou vous pouvez simplement vérifier lengthle nom du UIImage:

if (myImage && [myImage length]) {

    [UIImage imageNamed:myImage];
}
Fabio
la source
1
Au cas où quelqu'un ferait la même erreur que moi, j'essayais de mettre à jour l'image d'arrière-plan d'un UIButton à supprimer (aucune image du tout) et j'ai donc changé mon nom UIImage d'une chaîne en juste "", ce qui a causé l'erreur. En supprimant toute la UIImage (nommée: "") et en la remplaçant par nil, l'erreur a disparu.
Dave G
@DaveG Vous monsieur, m'a fait gagner des heures. Merci pour le commentaire!
Jeff
22

Étant donné que l'erreur se plaint que le nom que vous avez donné est (null), cela est probablement dû à un appel [UIImage imageNamed:nil]. Ou plus précisément, la transmission d'une variable n'a pas été définie, elle est donc égale à nil. Bien que l'utilisation stringWithFormat:élimine l'erreur, je pense qu'il y a de fortes chances que cela ne fasse pas ce que vous voulez. Si le nom que vous fournissez est une nilvaleur, alors l'utilisation de stringWithFormat: entraînera la recherche d'une image littéralement nommée "(null)", comme si vous appeliez [UIImage imageNamed:@"(null)"].

Quelque chose comme ça est probablement une meilleure option:

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

Vous voudrez peut-être définir un point d'arrêt dans Xcode sur cette ligne "Faire autre chose", pour vous aider à comprendre pourquoi ce code est appelé avec une valeur nulle en premier lieu.

robotspacer
la source
1
J'ai eu le même problème et l'erreur était que le nom de l'image était nul comme le dit robotspacer.
diegomen
17

Dans Xcode 6.4, cela semble se produire lors de l'utilisation de "Image sélectionnée" pour un élément de la barre d'onglets dans le storyboard, même s'il s'agit d'une image valide.

entrez la description de l'image ici

Cela ne semble pas réellement définir l'image d'état sélectionnée de toute façon, elle doit donc être définie dans les attributs d'exécution définis par l'utilisateur et supprimée de l'attribut SelectedImage de l'élément de la barre d'onglets.

entrez la description de l'image ici

ginchly
la source
1
Merci pour ça! Ces messages d'erreur / d'avertissement me rendaient fou! Je ne peux pas comprendre pourquoi Apple ne supprime pas l'élément de la barre d'onglets "Image sélectionnée" dans IB ou ne le corrige pas pour qu'il fonctionne correctement.
wcochran
4

Dans mon cas, je passais [UIImage imageNamed: @ ""], ce qui m'a fait afficher l'avertissement. Ajoutez simplement des points d'arrêt à toutes les lignes où vous avez utilisé imageNamed et déboguez la ligne où vous trouvez l'avertissement.

Rahul Mathur
la source
J'utilise également [UIImage imageNamed:@""]. Comment l'avez-vous réparé?
Julfikar
[aButton setImage: nil forState: UIControlStateNormal]
Hahnemann
À part l'utilisation d'un ifpour tester si le nom de l'image n'est pas une chaîne vide, ou l'utilisation d'une image "noImage" par défaut, comment afficher aucune image lorsqu'aucun nom applicable ne s'applique et que les éléments ne contiennent pas d'image "noImage"?
parti le
2

Cela m'est arrivé après qu'un storyboard ait été divisé en plusieurs (le changement réel s'est produit lorsque j'étais en vacances, donc je ne sais pas exactement comment cela a été fait).

Après avoir inspecté le XML des storyboards, j'ai trouvé qu'une référence d'image qui avait précédemment pointé vers "bottomBar" dans le catalogue des ressources pointait plutôt vers imageView:fFo-1g-jzs:image .

À la fin du fichier XML sous la <resources>balise se trouvait la balise nommée <image name="imageView:fFo-1g-jzs:image">contenant un gros mutableDatablob.

Après avoir réinitialisé la référence d'image dans le storyboard et supprimé le blob, l'erreur a disparu.

idrougge
la source
Cela l'a résolu pour moi, je cherchais ce problème depuis un moment maintenant, cela m'a rendu fou. Le schtick de point d'arrêt n'a pas fonctionné pour moi.
Moshe Gottlieb
Même problème ici, mais le point d'arrêt m'a aidé à trouver le xib dans lequel il se trouvait. Le nom de l'image était Image inconnue dans IB.
Josh Bernfeld
1

Je viens de corriger cette erreur. Vérifiez simplement l'utilisation de la [UIImage imageNamed:(NSString*) imageName]fonction. Si l' imageNameest nil, alors erreur se produit.

passwind
la source
1

Vous fournissez un nom d'image non valide, vous devez donc valider avant de le mettre, vous pouvez utiliser l'une des méthodes ci-dessus, selon ce qui est logique pour votre code ou autre.

if (iconImageName && [iconImageName length])
{

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

J'espère que cela aidera !!!!

Aks
la source
0

La raison de l'erreur passe une valeur nulle à la méthode «imageNamed:». Pour éviter cela, vous pouvez masquer votre imageView lorsque vous essayez de transmettre la valeur nil. Les chances peuvent se produire lors de la réutilisation des imageViews dans UITableView ou peuvent être dans scrollViews.

J'ai évité l'avertissement avec la vérification ci-dessous:

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;
}
Bharat
la source
0

J'ai reçu cet avertissement lorsque je charge l'utilisation de l'image [[UIImage imageNamed:normalStr] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal], puis, je passe à [UIImage imageNamed:normalStr], l'avertissement a disparu.

Meilbn
la source
0

Une approche consiste à faire basculer la méthode de classe pour remplacer [UIImage imageNamed:] par votre propre implémentation, puis à vérifier le nom de l'image dans votre implémentation. Voir ce qui suit:

Comment faire basculer une méthode de classe sur iOS?

J'ai implémenté cela dans ma catégorie 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
}

Vous voudrez peut-être également swizzler [UIImage imageNamed:inBundle:compatibleWithTraitCollection:].

Haoxin Li
la source
-1

Peut-être que vous pouvez l'utiliser pour confirmer que "imageName" n'est pas un "nil", alors vous laisserez cet avertissement de côté.

 if (imageName) {
    self.imageView.image = [UIImage imageNamed:imageName];
 }
Tenma Tobyo
la source