Errore: CUICatalog: nome della risorsa fornito non valido: (null) o fattore di scala non valido: 2.000000


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

Screenshot aggiunto

Ottenere questo avviso durante l'utilizzo di TableViewController. Come correggere questo errore e quale blocco è interessato?


Puoi inserire del codice?
Patrick Hofman

2
Questo avviso viene visualizzato anche se il nome dell'immagine è una stringa vuota
onmyway133

Risposte:


242

Questo appare quando qualcuno sta cercando di mettere nilin[UIImage imageNamed:]

Aggiungi punto di interruzione simbolico per [UIImage imageNamed:]Esempio di punto di interruzione simbolico

Aggiungi $arg3 == nilcondizione su Simulator, $r0 == nilcondizione su iPhone a 32 bit o $x2 == nilsu iPhone a 64 bit.

Esegui la tua applicazione e vedi dove si fermerà il debugger.

PS Tieni presente che questo accade anche se il nome dell'immagine è una stringa vuota. Puoi verificarlo aggiungendo [(NSString*)$x2 length] == 0alla condizione.


7
Questo è un approccio intelligente. Sembra che la mia immagine zero sia da qualche parte nel mio pennino, quindi non sta passando UIImage imageNamed:, ma sto comunque salvando questo punto di interruzione.
cbown

9
Non conoscevo la $arg3sintassi per i punti di interruzione condizionali. Dove posso saperne di più?
Zev Eisenberg

3
Non sono sicuro di capire perché non funziona per me, ritorno sempre error: use of undeclared identifier '$arg3'. Ho dimenticato qualcosa?
Ben

5
Continuo a ricevere: Arrestato a causa di un errore durante la valutazione della condizione del punto di interruzione 23.1: "$ r0 == nil" Impossibile analizzare l'espressione condizionale: errore: utilizzo dell'identificatore non dichiarato '$ r0' errore: 1 errore di analisi dell'espressione
Pranoy C

8
Nel mio caso la stringa del nome dell'immagine era vuota, quindi il controllo della lunghezza di arg3 ha funzionato per me. (int)[$arg3 length] == 0
Matthew Korporaal

62

Questo errore (di solito) si verifica quando provi a caricare un'immagine con [UIImage imageNamed:myImage]ma iOS non è sicuro che myImagesia davvero a NSStringe quindi hai questo avviso.

Puoi risolvere questo problema usando:

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

Oppure puoi semplicemente controllare lengthil nome di UIImage:

if (myImage && [myImage length]) {

    [UIImage imageNamed:myImage];
}

1
Nel caso qualcuno avesse commesso lo stesso errore che ho fatto io, stavo cercando di aggiornare l'immagine di sfondo di un UIButton da rimuovere (nessuna immagine) e quindi ho cambiato il mio nome UIImage da una stringa a solo "", che ha causato l'errore. Rimuovendo l'intero UIImage (denominato: "") e sostituendolo con zero, l'errore è scomparso.
Dave G

@DaveG Lei signore, mi ha fatto risparmiare ore. Grazie per il commento!
Jeff

22

Poiché l'errore si lamenta del nome che hai dato (null), molto probabilmente è causato dalla chiamata [UIImage imageNamed:nil]. O più specificamente, il passaggio di una variabile non è stato impostato, quindi è uguale a nil. Mentre l'utilizzo stringWithFormat:eliminerebbe l'errore, penso che ci siano buone probabilità che non stia effettivamente facendo quello che vuoi. Se il nome fornito è un nilvalore, l'uso di stringWithFormat: comporterebbe la ricerca di un'immagine denominata letteralmente "(null)", come se si stesse chiamando [UIImage imageNamed:@"(null)"].

Qualcosa del genere è probabilmente un'opzione migliore:

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

Potresti voler impostare un punto di interruzione in Xcode su quella riga "Fai qualcos'altro", per aiutarti a capire perché questo codice viene chiamato con un valore nullo in primo luogo.


1
Ho avuto lo stesso problema e l'errore era che il nome dell'immagine era nullo come dice robotspacer.
diegomen

17

In Xcode 6.4, questo sembra verificarsi quando si utilizza "Immagine selezionata" per un elemento della barra delle schede nello storyboard, anche se è un'immagine valida.

inserisci qui la descrizione dell'immagine

Questo in realtà non sembra impostare comunque l'immagine dello stato selezionato, quindi deve essere definito in Attributi di runtime definiti dall'utente e rimosso dall'attributo SelectedImage dell'elemento della barra delle schede

inserisci qui la descrizione dell'immagine


1
Grazie per questo! Questi messaggi di errore / avviso mi stavano facendo impazzire! Non riesco a capire perché Apple non elimina il menu a discesa "Immagine selezionata" dell'elemento della barra delle schede in IB o non lo risolve in modo che funzioni correttamente.
wcochran

4

Nel mio caso stavo passando [UIImage imageNamed: @ ""] che mi ha fatto mostrare l'avvertimento. Basta aggiungere punti di interruzione a tutte le righe in cui hai usato imageNamed e il debug della riga in cui trovi l'avviso.


Sto anche usando [UIImage imageNamed:@""]. Come l'hai risolto?
Julfikar

[aButton setImage: nil forState: UIControlStateNormal]
Hahnemann

Oltre a utilizzare un ifper verificare se il nome dell'immagine non è una stringa vuota o utilizzare un'immagine "noImage" predefinita, come si fa a non visualizzare alcuna immagine quando non si applica alcun nome applicabile e le risorse non contengono un'immagine "noImage"?
andato il

2

Questo è successo a me dopo che uno storyboard è stato diviso in più (il vero cambiamento è avvenuto durante le vacanze, quindi non so esattamente come sia stato fatto).

Dopo aver controllato l'XML degli storyboard, ho scoperto che un riferimento a un'immagine che in precedenza aveva indicato "bottomBar" nel catalogo delle risorse indicava invece imageView:fFo-1g-jzs:image.

Alla fine del file XML sotto il <resources>tag c'era un tag denominato <image name="imageView:fFo-1g-jzs:image">contenente un grosso mutableDatablob.

Dopo aver reimpostato il riferimento dell'immagine nello storyboard e aver rimosso il BLOB, l'errore è scomparso.


Questo mi ha risolto, cercavo questo problema da un po 'di tempo, mi ha fatto impazzire. Il breakpoint schtick non ha funzionato per me.
Moshe Gottlieb

Lo stesso problema qui, ma il punto di interruzione mi ha aiutato a trovare l'xib in cui si trovava. Il nome dell'immagine era Unknown Image in IB.
Josh Bernfeld

1

Ho appena corretto questo errore. Basta controllare l'utilizzo della [UIImage imageNamed:(NSString*) imageName]funzione. Se imageNameè nil, si verifica un errore.


1

Stai fornendo un nome di immagine non valido, quindi devi convalidare prima di inserirlo puoi eseguire uno dei modi sopra indicati a seconda di quale abbia senso per il tuo codice o simile

if (iconImageName && [iconImageName length])
{

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

Spero che possa aiutare !!!!


0

Il motivo dell'errore sta passando un valore nullo al metodo "imageNamed:". Per evitare ciò, puoi nascondere il tuo imageView quando provi a passare il valore nullo. Le possibilità possono verificarsi nel riutilizzo delle imageViews in UITableView o possono essere in scrollViews.

Ho evitato l'avviso con il seguente controllo:

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

Ho ricevuto questo avviso quando carico l'uso dell'immagine [[UIImage imageNamed:normalStr] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal], quindi, cambio a [UIImage imageNamed:normalStr], l'avviso non c'era più.


0

Un approccio è fare swizzling del metodo di classe per sostituirlo [UIImage imageNamed:]con la propria implementazione, quindi controllare il nome dell'immagine nella propria implementazione. Vedere quanto segue:

Come cambiare un metodo di classe su iOS?

L'ho implementato nella mia categoria 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
}

Potresti anche volere swizzle [UIImage imageNamed:inBundle:compatibleWithTraitCollection:].


-1

Forse puoi usarlo per confermare che "imageName" non è uno "zero", quindi lascerai questo avvertimento.

 if (imageName) {
    self.imageView.image = [UIImage imageNamed:imageName];
 }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.