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.