2013-09-22 13 views
7

Desidero questo metodo per verificare se una condizione è vera, quindi impostare un pulsante specifico (pulsante) per avere le immagini che specifica. Ecco il codice.Impostazione metodo immagine pulsante

-(void)canAfford:(float) f: (UIButton*)button { 
    if([self playerHas:(f)] == YES) { 
     [button setImage:[UIImage imageNamed:nil] forState:UIControlStateNormal]; 
     [button setImage:[UIImage imageNamed:@"ButtonBGclicked.png"] forState:UIControlStateHighlighted]; 
    } else { 
     [button setImage:[UIImage imageNamed:@"ButtonBG.png"] forState:UIControlStateNormal]; 
     [button setImage:[UIImage imageNamed:nil] forState:UIControlStateHighlighted]; 
    } 
} 

Ecco l'errore che ottengo.

2013-09-22 10:35:39.985 Tapple[15663:a0b] CUICatalog: Invalid asset name supplied: , or invalid scale factor: 1.000000 

risposta

13

Si sta chiamando [UIImage imageNamed:@""] o [UIImage imageNamed:nil]. Nessuna immagine corrisponderà alla stringa vuota. Se si sta tentando di cancellare l'immagine, passare nil anziché chiamare imageNamed:.

Prova questo (codice aggiornato originale, incorporando il commento di @ Kyle Fang):

- (void)canAfford:(float) f: (UIButton*)button { 
    if([self playerHas:(f)] == YES) { 
     [button setImage:nil forState:UIControlStateNormal]; 
     [button setImage:[UIImage imageNamed:@"ButtonBGclicked.png"] forState:UIControlStateHighlighted]; 
    } else { 
     [button setImage:[UIImage imageNamed:@"ButtonBG.png"] forState:UIControlStateNormal]; 
     [button setImage:nil forState:UIControlStateHighlighted]; 
    } } 
+0

Lo stesso errore si verifica ancora. –

+2

Penso che @bneely significhi '[pulsante setImage: nil forState: UIControlStateHighlighted];' –

1

ho cominciato ad avere lo stesso errore "CUICatalog: nome risorsa non valido fornito: o fattore di scala non valida: 2,000 mila" dopo aver usato il catalogo delle risorse, nuovo in Xcode 5.

Dopo un po 'di debug ho scoperto che quello che stava causando quell'errore stava passando un argomento di "nil" o una stringa vuota @ "" al metodo di classe [UIImage imageNamed:]. Anche il passaggio di un nome di file che non esisteva nel pacchetto non ha attivato quell'errore.

Quindi sono d'accordo con bneely (quindi ho ottenuto il mio voto) per la correzione. Ora se hai fatto ciò che ti ha suggerito e hai ancora ricevuto l'errore, assicurati di esaminare il codice e magari inserire un punto di interruzione ovunque tu stia chiamando [UIImage imageNamed:] e vedere se stai passando un nil o una stringa vuota come discussione.

FYI, per creare un punto di interruzione, è sufficiente fare clic sul bordo sinistro dell'editor del codice e aggiungere il punto di interruzione blu. Quindi fai clic con il pulsante destro del mouse sul punto di interruzione e seleziona "Modifica punto di interruzione .." dal menu che si apre. Poi nel "Condizione" a forma di scatola qualcosa di simile:

(! ImageFileName || [ImageFileName isEqualToString: @ ""])

dove ImageFileName è la stringa che rappresenta il file di immagine che si sta cercando di caricare.

+3

Se qualcuno mai riesce a trovare un modo per modificare le condizioni di più punti di interruzione contemporaneamente, fammi sapere ... Questo è un errore difficile trova la fonte di se hai un grande progetto. – danbretl

1

Ho scoperto che l'origine di questo problema per me era che l'array con cui stavo ottenendo i dati dalla definizione dell'immagine, è stato contrassegnato con weak, nonatomic e scaricato da sotto di me.

L'impostazione dell'array di origini dati come nonatomic, retain ha risolto questo problema inafferrabile.

0

Leggere questo solo se si utilizza IB o Storyboard!

Ho avuto questo problema dopo aver impostato l'immagine per UIImageView nello storyboard e quindi modificato il nome dell'immagine nel catalogo delle risorse. ImageView nello storyboard era ancora con quell'immagine, anche se nell'ispettore degli attributi per la visualizzazione dell'immagine, il campo dell'immagine stava dicendo "Immagine sconosciuta". Tutto ha funzionato bene perché in seguito stavo impostando l'immagine tramite il codice, ad eccezione del log fastidioso.

Ugh, sembra un uso eccessivo della parola "immagine", spero che aiuti qualcuno.

5

Un modo migliore per utilizzare i punti di interruzione per trovare la chiamata specifica che sta causando + [UIImage imagenamed:] per generare l'errore consiste nell'utilizzare un punto di interruzione simbolico.

Aprire il Breakpoint Navigator e fare clic sul pulsante "+" in basso a sinistra.Seleziona "Aggiungi punto di rottura simbolico ...". Quindi modificare il punto di interruzione di avere queste impostazioni:

Simbolo: + [UIImage imageNamed:] Condizione: $ r2 == nil

La condizione test registrano r2, che indica l'argomento al imageNamed: metodo, per un argomento nullo del metodo. È anche possibile impostare la condizione su (BOOL) [(NSString *) $ r2 isEqualToString: @ ""], se si desidera verificare se una stringa vuota è stata utilizzata come argomento. Si noti che il registro r2 è presente solo nel caso di debug su un dispositivo. Il simulatore utilizzerà un registro con un nome diverso poiché è in esecuzione sull'architettura x86.

Quando le condizioni sono soddisfatte, il debugger si romperà nel codice assembler della libreria UIKit, ma è possibile individuare la sorgente di origine della chiamata nella traccia dello stack del thread.

È necessario solo questo singolo punto di interruzione per controllare l'intera base di codici per l'origine della chiamata.

1

1) Aggiungere BreakPoint simbolico dopo aver premuto il pulsante più. plus sign at the bottom 2) aggiungere questa riga booleana per verificare la stringa vuota boolean line for condition 3) questo è stato aggiunto automaticamente (non è sicuro dopo la generazione o no) così ho modificato per aggiungere condizioni check for nil

Spero che questo potrebbe aiutare un po 'di più , me incluso.

Problemi correlati