Questo è un problema strano, che non avevo visto fino a questa settimana.
Di seguito sono le mie conclusioni e una soluzione al problema.
Nella mia app per iPhone, ho scaricato un'immagine e la ho archiviata localmente, e questo ha sempre funzionato bene.
Ma ora quando eseguo lo stesso codice, improvvisamente non è riuscito a creare un UIImage
utilizzando la funzione imageNamed
e ora restituiva zero.
tre note però:
- Questo codice esatto hanno funzionato prima, utilizzando lo stesso codice sorgente e file di immagine .png. Non sono sicuro che la mia copia di XCode 6.xo iOS 8.x si sia tranquillamente aggiornata nel frattempo.
- Il codice continua per funzionare correttamente (con lo stesso file di immagine) sul simulatore iPhone. Semplicemente non funziona su un dispositivo reale.
- Dai uno sguardo al codice qui sotto. Quando
UIImage:imageNamed
non è riuscito, ho eseguito un po 'di codice per verificare se il file è effettivamente esistito .. e lo ha fatto. Quindi ho caricato i dati binari dal file utilizzando NSData:contentsAtPath
(che dimostra anche che il file esiste ed era nella cartella giusta), quindi creato uno UIImage
e ha funzionato correttamente.
Eh ?!
UIImage* img = [UIImage imageNamed:backgroundImageFilename];
if (img != nil)
{
// The image loaded fine (this always worked before). Job done.
// We'll set our UIImageView "imgBackgroundView" to contain this image.
self.imgBackgroundView.image = img;
}
else
{
// We were unable to load the image file for some reason.
// Let's investigate why.
// First, I checked whether the image was actually on the device, and this returned TRUE...
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:backgroundImageFilename];
if (fileExists)
NSLog(@"Image file does exist.");
else
NSLog(@"Image file does not exist.");
// Next, I attempted to just load the bytes in the file, and amazingly, this also worked fine...
NSData *data = [[NSFileManager defaultManager] contentsAtPath:backgroundImageFilename];
if (data != nil)
{
// ..and then I COULD actually create a UIImage out of it.
img = [UIImage imageWithData:data];
if (img != nil)
{
// We have managed to load the .png file, and can now
// set our UIImageView "imgBackgroundView" to contain this image.
self.imgBackgroundView.image = img;
}
}
}
Come ho detto, questo codice fornisce un soluzione per questo problema, ma è molto strano che si tratta di un tratto ha cominciato ad accadere.
E, dovrei dire, ho provato gli altri suggerimenti in questo thread, pulire il progetto, rimuovere DerivedData, rimuovere completamente l'app dal dispositivo e così via, ma non hanno fatto alcuna differenza.
Sarei interessato a sapere se qualcun altro ha riscontrato questo problema e scopre che il mio esempio di codice funziona per loro.
Aggiornamento
che sono un idiota.
non sono sicuro se la funzione UIImage:imageNamed
è cambiato o qualcosa del genere (e in tal caso, il motivo per cui continua a lavorare bene su iPhone 8.1 Simulator), ma ho trovato la seguente una linea fa lavoro va bene:
UIImage* img = [[UIImage alloc] initWithContentsOfFile:backgroundImageFilename];
Quindi sembra che dovresti usare questa funzione per caricare immagini che non fanno parte del pacchetto della tua app.
Anch'io ho avuto problemi in passato, quindi potrebbe essere d'aiuto ... –
Sono così sicuro di averlo fatto poche volte prima. Ora ha funzionato. Grazie. – Gricha
Verifica: 'XCode - Fasi di build - Copia le risorse del bundle - {vedi l'immagine è disponibile o no} aggiungi ed esegui'. – Vicky