Fehler: CUICatalog: Ungültiger Asset-Name angegeben: (null) oder ungültiger Skalierungsfaktor: 2.000000

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

Screenshot hinzugefügt

Diese Warnung wird während der Arbeit mit TableViewController angezeigt. Wie kann dieser Fehler behoben werden und welcher Block ist betroffen?

manish singh
quelle
Kannst du einen Code posten?
Patrick Hofman
2
Diese Warnung erscheint auch, wenn der
Bildname eine

Antworten:

242

Dies erscheint , wenn jemand zu setzen versucht , nilin[UIImage imageNamed:]

Fügen Sie einen symbolischen Haltepunkt für hinzu [UIImage imageNamed:]Beispiel für einen symbolischen Haltepunkt

Fügen Sie eine $arg3 == nilBedingung auf dem Simulator, eine $r0 == nilBedingung auf dem 32-Bit-iPhone oder $x2 == nilauf dem 64-Bit-iPhone hinzu.

Führen Sie Ihre Anwendung aus und sehen Sie, wo der Debugger stoppt.

PS Beachten Sie, dass dies auch passiert, wenn der Bildname eine leere Zeichenfolge ist. Sie können dies überprüfen, indem Sie [(NSString*)$x2 length] == 0der Bedingung hinzufügen .

tt.Kilew
quelle
7
Dies ist ein kluger Ansatz. Es sieht so aus, als ob sich mein Nullbild irgendwo in meiner Feder befindet, also geht es nicht durch UIImage imageNamed:, aber ich speichere diesen Haltepunkt trotzdem.
cbowns
9
Ich wusste nichts über die $arg3Syntax für bedingte Haltepunkte. Wo kann ich mehr lernen?
Zev Eisenberg
3
Ich bin mir nicht sicher, warum es bei mir nicht funktioniert, und kehre immer wieder zurück error: use of undeclared identifier '$arg3'. Habe ich etwas verpasst?
Ben
5
Ich bekomme immer wieder: Gestoppt wegen eines Fehlers bei der Bewertung der Bedingung von Haltepunkt 23.1: "$ r0 == nil" Bedingter Ausdruck konnte nicht analysiert werden: Fehler: Verwendung des nicht deklarierten Bezeichners '$ r0' Fehler: 1 Fehler beim Analysieren des Ausdrucks
Pranoy C
8
In meinem Fall war die Bildnamenzeichenfolge leer, sodass die Überprüfung der arg3-Länge für mich funktioniert hat. (int)[$arg3 length] == 0
Matthew Korporaal
62

Dieser Fehler tritt (normalerweise) auf, wenn Sie versuchen, ein Bild mit zu laden [UIImage imageNamed:myImage], iOS jedoch nicht sicher myImageist , ob es sich wirklich um einen handelt, NSStringund dann diese Warnung angezeigt wird.

Sie können dies beheben, indem Sie:

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

Oder Sie können einfach nach lengthdem Namen des UIImage:

if (myImage && [myImage length]) {

    [UIImage imageNamed:myImage];
}
Fabio
quelle
1
Falls jemand den gleichen Fehler gemacht hat, den ich gemacht habe, habe ich versucht, das zu entfernende Hintergrundbild eines UIButton zu aktualisieren (überhaupt kein Bild), und deshalb habe ich meinen UIImage-Namen von einer Zeichenfolge in nur "" geändert, was den Fehler verursacht hat. Durch Entfernen des gesamten UIImage (mit dem Namen: "") und Ersetzen durch nil verschwand der Fehler.
Dave G
@ DaveG Sie, Sir, haben mir Stunden gespart. Danke für den Kommentar!
Jeff
22

Da der Fehler sich darüber beschwert, dass der von Ihnen angegebene Name lautet (null), wird dies höchstwahrscheinlich durch einen Anruf verursacht [UIImage imageNamed:nil]. Oder genauer gesagt, die Übergabe einer Variablen wurde nicht festgelegt, daher ist sie gleich nil. Während der Verwendung stringWithFormat:würde den Fehler beseitigen, ich denke, es besteht eine gute Chance, dass es nicht wirklich tut, was Sie wollen. Wenn der von Ihnen angegebene Name ein nilWert ist, führt die Verwendung von stringWithFormat: dazu, dass nach einem Bild mit dem wörtlichen Namen "(null)" gesucht wird, als würden Sie aufrufen [UIImage imageNamed:@"(null)"].

So etwas ist wahrscheinlich eine bessere Option:

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

Möglicherweise möchten Sie in Xcode einen Haltepunkt in dieser Zeile "Etwas anderes tun" festlegen, um herauszufinden, warum dieser Code überhaupt mit einem Nullwert aufgerufen wird.

Roboterspacer
quelle
1
Ich habe das gleiche Problem und der Fehler war, dass der Bildname gleich Null war, wie Robotspacer sagt.
Diegomen
17

In Xcode 6.4 scheint dies zu geschehen, wenn "Ausgewähltes Bild" für ein Registerkartenelement im Storyboard verwendet wird, auch wenn es sich um ein gültiges Bild handelt.

Geben Sie hier die Bildbeschreibung ein

Dies scheint das ausgewählte Statusbild ohnehin nicht festzulegen, daher muss es in benutzerdefinierten Laufzeitattributen definiert und aus dem SelectedImage-Attribut des Registerkartenleistenelements entfernt werden

Geben Sie hier die Bildbeschreibung ein

ginchly
quelle
1
Danke für das! Diese Fehler- / Warnmeldungen haben mich verrückt gemacht! Ich kann nicht herausfinden, warum Apple das Pulldown-Menü "Ausgewähltes Bild" in IB entweder nicht entfernt oder korrigiert, damit es ordnungsgemäß funktioniert.
wcochran
4

In meinem Fall habe ich [UIImage imageNamed: @ ""] übergeben, wodurch ich die Warnung angezeigt habe. Fügen Sie einfach allen Zeilen, in denen Sie imageNamed verwendet haben, Haltepunkte hinzu, und debuggen Sie die Zeile, in der Sie die Warnung finden.

Rahul Mathur
quelle
Ich benutze auch [UIImage imageNamed:@""]. Wie hast du das behoben?
Julfikar
[aButton setImage: nil forState: UIControlStateNormal]
Hahnemann
ifWie können Sie kein Bild anzeigen, wenn kein zutreffender Name zutrifft und die Assets kein "noImage" -Bild enthalten, außer wenn Sie ein verwenden , um zu testen, ob der Bildname keine leere Zeichenfolge ist, oder ein Standardbild "noImage" verwenden?
weg
2

Dies geschah mir, nachdem ein Storyboard in mehrere geteilt wurde (die eigentliche Änderung erfolgte in den Ferien, daher weiß ich nicht genau, wie es gemacht wurde).

Nachdem ich das XML der Storyboards überprüft hatte, stellte ich fest, dass stattdessen auf eine Bildreferenz verwiesen wurde, die zuvor im Asset-Katalog auf "bottomBar" verwiesen hatte imageView:fFo-1g-jzs:image.

Am Ende der XML-Datei unter dem <resources>Tag befand sich ein Tag <image name="imageView:fFo-1g-jzs:image">mit einem großen mutableDataBlob.

Nach dem Zurücksetzen der Bildreferenz im Storyboard und dem Entfernen des Blobs wurde der Fehler behoben.

Idrougge
quelle
Dies löste es für mich, suchte schon eine Weile nach diesem Problem und machte mich verrückt. Der Haltepunkt schtick hat bei mir nicht funktioniert.
Moshe Gottlieb
Das gleiche Problem hier, aber der Haltepunkt hat mir geholfen, das xib zu finden, in dem es sich befand. Der Bildname war Unbekanntes Bild in IB.
Josh Bernfeld
1

Ich habe diesen Fehler gerade behoben. Überprüfen Sie einfach die Verwendung der [UIImage imageNamed:(NSString*) imageName]Funktion. Wenn dies der Fall imageNameist nil, tritt ein Fehler auf.

Passwind
quelle
1

Sie geben einen ungültigen Bildnamen an. Sie müssen ihn daher vor dem Einfügen überprüfen. Sie können eine der oben genannten Methoden ausführen, je nachdem, was für Ihren Code oder ähnliches sinnvoll ist

if (iconImageName && [iconImageName length])
{

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

Hoffe es wird helfen !!!!

Aks
quelle
0

Der Grund für den Fehler ist die Übergabe eines Nullwerts an die Methode "imageNamed:". Um dies zu vermeiden, können Sie Ihre imageView ausblenden, wenn Sie versuchen, den Nullwert zu übergeben. Die Chancen können bei der Wiederverwendung der imageViews in UITableView oder in scrollViews auftreten.

Ich habe die Warnung mit der folgenden Überprüfung vermieden:

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;
}
Bharath
quelle
0

Ich habe diese Warnung erhalten, als ich die Bildnutzung geladen habe. Als [[UIImage imageNamed:normalStr] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]ich zu wechselte [UIImage imageNamed:normalStr], war die Warnung weg.

Meilbn
quelle
0

Ein Ansatz besteht darin, Klassenmethoden zu verwenden, um sie [UIImage imageNamed:]durch Ihre eigene Implementierung zu ersetzen , und dann den Image-Namen in Ihrer Implementierung zu überprüfen. Siehe folgendes:

Wie kann ich eine Klassenmethode unter iOS verwenden?

Ich habe dies in meiner Kategorie UIImage (Debug) implementiert:

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

Vielleicht möchten Sie auch schwitzen [UIImage imageNamed:inBundle:compatibleWithTraitCollection:].

Haoxin Li
quelle
-1

Vielleicht können Sie dies verwenden, um zu bestätigen, dass "imageName" kein "Null" ist. Dann lassen Sie diese Warnung weg.

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