TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
Ottenere questo avviso durante l'utilizzo di TableViewController. Come correggere questo errore e quale blocco è interessato?
TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
Ottenere questo avviso durante l'utilizzo di TableViewController. Come correggere questo errore e quale blocco è interessato?
Risposte:
Questo appare quando qualcuno sta cercando di mettere nil
in[UIImage imageNamed:]
Aggiungi punto di interruzione simbolico per [UIImage imageNamed:]
Aggiungi $arg3 == nil
condizione su Simulator, $r0 == nil
condizione su iPhone a 32 bit o $x2 == nil
su 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] == 0
alla condizione.
UIImage imageNamed:
, ma sto comunque salvando questo punto di interruzione.
$arg3
sintassi per i punti di interruzione condizionali. Dove posso saperne di più?
error: use of undeclared identifier '$arg3'
. Ho dimenticato qualcosa?
(int)[$arg3 length] == 0
Questo errore (di solito) si verifica quando provi a caricare un'immagine con [UIImage imageNamed:myImage]
ma iOS non è sicuro che myImage
sia davvero a NSString
e quindi hai questo avviso.
Puoi risolvere questo problema usando:
[UIImage imageNamed:[NSString stringWithFormat:@"%@", myImage]]
Oppure puoi semplicemente controllare length
il nome di UIImage
:
if (myImage && [myImage length]) {
[UIImage imageNamed:myImage];
}
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 nil
valore, 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.
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.
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
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.
[UIImage imageNamed:@""]
. Come l'hai risolto?
if
per 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"?
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 mutableData
blob.
Dopo aver reimpostato il riferimento dell'immagine nello storyboard e aver rimosso il BLOB, l'errore è scomparso.
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 !!!!
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;
}
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:]
.
Forse puoi usarlo per confermare che "imageName" non è uno "zero", quindi lascerai questo avvertimento.
if (imageName) {
self.imageView.image = [UIImage imageNamed:imageName];
}