2013-04-07 3 views
9
[UIImage imageNamed:filename] 

Questo metodo restituisce null solo sul dispositivo.iOS - UIImmagine imageNamed: restituisce null sul dispositivo

So che il problema è noto e in genere è dovuto al fatto che il simulatore non fa distinzione tra maiuscole e minuscole. Ho provato le soluzioni proposte qui: UIImage imageNamed returns nil

Ma niente ha funzionato per me.

Il caso è semplice: ho 4 file denominati: [email protected]~ipad.png, [email protected]~iphone.png, Bar ~ ipad.png, Bar ~ iphone.png. Tutti sono in progetto con casella di controllo selezionata.

NSLog(@"%@",[UIImage imageNamed:@"Bar"]); 

Quella riga di codice mi dà nulla per il dispositivo e davvero non hanno idea di quello che sto facendo di sbagliato in questo momento.

risposta

5

Recentemente ho avuto un problema simile.

Dopo aver giocato con nomi di file e percorsi a volte è utile quando si pulisce e si ricostruisce il progetto.

+0

Anch'io ho avuto problemi in passato, quindi potrebbe essere d'aiuto ... –

+0

Sono così sicuro di averlo fatto poche volte prima. Ora ha funzionato. Grazie. – Gricha

+0

Verifica: 'XCode - Fasi di build - Copia le risorse del bundle - {vedi l'immagine è disponibile o no} aggiungi ed esegui'. – Vicky

4

Mi sono ritrovato nella stessa situazione di recente.

La soluzione nel mio caso era aggiungere l'estensione al nome del file.

[UIImage imageNamed:@"Bar.png"] 
+0

Grazie. Ci ho provato e sfortunatamente non è stato d'aiuto nel mio caso. – Gricha

+0

in caso di png che non dovrebbe importare .. forse ti sei trovato di fronte ad un altro file format –

+2

No era png, e il downvote non sembra molto appropriato. –

1

completamente pulito il vostro costruire e rifare:

  1. eliminare l'applicazione dal dispositivo
  2. opzione pulire l'intera cartella di generazione in Xcode (⌘-Maiuscole-K)
  3. smettere di Xcode
  4. cancellare ~/Library/Developer/Xcode/DerivedData
  5. riavvio Xcode, costruire e gestire
0

Ho riscontrato questo problema e l'ho risolto. Ho elencato la soluzione qui sotto come riferimento.

Ho diverse immagini e uso [UIImage imageNamed: filePath] per visualizzarle. Tutte le immagini sono visualizzate bene tranne 1 sul simulatore/dispositivo, ma tutte possono essere viste su OS X. Per quell'immagine, [UIImage imageNamed] restituisce sempre null.

Dopo alcuni minuti di indagine, ho scoperto che il problema di causa dell'immagine è molto grande nelle dimensioni del file: 4.1M. Altri sono tutti intorno a 800kb. Hanno dimensioni quasi identiche.

Quindi provo ad aprirlo nell'editor di immagini, quindi ri-salvarlo. Dopo questo, la dimensione è scesa a 800k. problema risolto.

Le ragioni credo,

  1. [UIImage imageNamed: filePath] ha un limite di dimensione massima del file? (bassa possibilità, ma è necessario controllare il documento ufficiale)

  2. l'immagine stessa ha qualche errore. Ma OS X ha una tolleranza migliore di iOS. quindi iOS non può leggere e restituire null.Questo problema è come OS X può riprodurre più tipi di file video rispetto a iOS poiché supporta più codec.

quindi se si verifica questo problema in futuro, osservare alcuni secondi la dimensione del file. Spero aiuto

1

Questo è capitato a me, e di scoprire era molto dura: ho avuto una sola immagine che dove nullo solo sul dispositivo

logoWhite.png 

il mio codice:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"LogoWhite"] forBarMetrics:UIBarMetricsDefault]; 

Dopo un po 'di debugging, Ho notato che il nome dell'immagine inizia con la maiuscola. Ovviamente questo non ha importanza su OSX con un file system del caso ignorato. Il file system di iOs non lo è, quindi l'immagine ha funzionato sul simulatore ma non sul dispositivo.

Scommetto che tutte le soluzioni sulla pulizia dei dati derivati ​​e sulla ricostruzione sono terminate in modo casuale con la ridenominazione dell'immagine, e anche questo avrebbe funzionato. Pubblicare qui solo per riferimento futuro :)

+0

L'OP ha effettivamente menzionato che aveva controllato il caso del nome file perché quello (simulator = case-insensitive vs device = case-sensitive) è un problema ben noto. Non era quindi il nome del file che era il problema in questo caso. – siburb

0

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ò:

  1. 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.
  2. Il codice continua per funzionare correttamente (con lo stesso file di immagine) sul simulatore iPhone. Semplicemente non funziona su un dispositivo reale.
  3. 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.

0

Ho anche lo stesso problema di: XCode - Build Phases - Copy Bundle Resources - {vedi l'immagine è disponibile o no} - add{image} - clean - delete app - Run.

0

Vorrei aggiungere un altro punto importante a tutte le soluzioni di cui sopra

Assicurati di aggiungere il vostro risorsa immagine al bersaglio giusto

Per errore se Developer collegamento mess-up con risorse e il bersaglio quindi le condizioni sorgono.

se si dispone di più target, quindi controllare due volte che la risorsa è impostata per correggere la destinazione.

Esempio di schermata allegata in caso di collegamento di risorse tra più destinazioni.

enter image description here