Erro: CUICatalog: nome de ativo inválido fornecido: (nulo) ou fator de escala inválido: 2.000000


120
TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000

Captura de tela adicionada

Recebendo esse aviso ao trabalhar com o TableViewController. Como corrigir esse erro e qual bloco é afetado?


Pode postar algum código?
22810 Patrick Hofman

2
Este aviso também aparece se o nome da imagem é string vazia
onmyway133

Respostas:


242

Este aparece quando alguém está tentando colocar nilem[UIImage imageNamed:]

Adicionar ponto de interrupção simbólico para [UIImage imageNamed:]Exemplo de ponto de interrupção simbólico

Adicione $arg3 == nilcondição no Simulador, $r0 == nilcondição no iPhone de 32 bits ou $x2 == nilno iPhone de 64 bits.

Execute seu aplicativo e veja onde o depurador irá parar.

PS Lembre-se de que isso também acontece se o nome da imagem for uma string vazia. Você pode verificar isso adicionando [(NSString*)$x2 length] == 0à condição.


7
Esta é uma abordagem inteligente. Parece que minha imagem nula está em algum lugar da minha ponta, então não está passando UIImage imageNamed:, mas estou salvando esse ponto de interrupção.
Cbowns

9
Eu não sabia sobre a $arg3sintaxe para pontos de interrupção condicionais. Onde posso aprender mais?
Zev Eisenberg

3
Não tenho certeza de entender por que não funciona para mim, sempre retornando error: use of undeclared identifier '$arg3'. Perdi alguma coisa?
Ben

5
continuo recebendo: Parado devido a um erro ao avaliar a condição do ponto de interrupção 23.1: "$ r0 == nil" Não foi possível analisar a expressão condicional: erro: uso do identificador não declarado '$ r0' erro: 1 erros na análise da expressão
Pranoy C

8
No meu caso, a string do nome da imagem estava vazia, portanto, verificar o comprimento do arg3 funcionou para mim. (int)[$arg3 length] == 0
Matthew Korporaal

62

Esse erro (geralmente) ocorre quando você tenta carregar uma imagem, [UIImage imageNamed:myImage]mas o iOS não tem certeza se myImageé realmente um NSStringe então você tem esse aviso.

Você pode corrigir isso usando:

[UIImage imageNamed:[NSString stringWithFormat:@"%@", myImage]]

Ou você pode simplesmente verificar lengtho nome do UIImage:

if (myImage && [myImage length]) {

    [UIImage imageNamed:myImage];
}

1
No caso de alguém cometer o mesmo erro que eu, estava tentando atualizar a imagem de plano de fundo de um UIButton para ser removida (nenhuma imagem) e, portanto, mudei meu nome UIImage de uma string para apenas "", o que causou o erro. Removendo a UIImage inteira (chamada: "") e substituindo-a por zero, o erro desapareceu.
Dave G

@DaveG Seu senhor, me salvou horas. Obrigado pelo comentário!
Jeff

22

Como o erro está reclamando que o nome que você deu é (null), isso provavelmente é causado pela chamada [UIImage imageNamed:nil]. Ou, mais especificamente, a transmissão de uma variável não foi definida, portanto é igual a nil. Enquanto o uso stringWithFormat:se livra do erro, acho que há uma boa chance de ele não estar realmente fazendo o que você deseja. Se o nome que você fornecer for um nilvalor, o uso de stringWithFormat: resultará na procura de uma imagem literalmente denominada "(nulo)", como se você estivesse chamando [UIImage imageNamed:@"(null)"].

Algo assim é provavelmente uma opção melhor:

if (name) {
    UIImage *image = [UIImage imageNamed:name];
} else {
    // Do something else
}

Você pode definir um ponto de interrupção no Xcode na linha "Faça outra coisa", para ajudá-lo a descobrir por que esse código está sendo chamado com um valor nulo em primeiro lugar.


1
Eu tive o mesmo problema e o erro foi que o nome da imagem era nulo, como o robotspacer diz.
diegomen

17

No Xcode 6.4, isso parece ocorrer ao usar "Imagem selecionada" para um item da barra de guias no storyboard, mesmo que seja uma imagem válida.

insira a descrição da imagem aqui

Na verdade, isso parece não definir a imagem de estado selecionada, portanto, precisa ser definida em Atributos de tempo de execução definidos pelo usuário e removida do atributo SelectedImage do item da barra de guias

insira a descrição da imagem aqui


1
Obrigado por isso! Essas mensagens de erro / aviso estavam me deixando louco! Não consigo entender por que a Apple não se livra do menu suspenso "Imagem selecionada" do item da barra de guias no IB ou o corrige para que funcione corretamente.
wcochran 1/09/15

4

No meu caso, eu estava passando [UIImage imageNamed: @ ""], o que me levou a mostrar o aviso. Basta adicionar pontos de interrupção a todas as linhas em que você usou o imageNamed e depurar a linha em que você encontra o aviso.


Eu também estou usando [UIImage imageNamed:@""]. Como você consertou isso?
Jul17

[aButton setImage: nil forState: UIControlStateNormal]
Hahnemann

Além de usar um ifpara testar se o nome da imagem não é uma sequência vazia ou usar uma imagem "noImage" padrão, como você não exibe nenhuma imagem quando nenhum nome aplicável se aplica e os Ativos não contêm uma imagem "noImage"?
foi

2

Isso aconteceu comigo depois que um storyboard foi dividido em vários (a mudança real aconteceu quando eu estava de férias, então não sei exatamente como isso foi feito).

Depois de inspecionar o XML dos storyboards, descobri que uma referência de imagem que anteriormente havia apontado para "bottomBar" no catálogo de ativos indicava imageView:fFo-1g-jzs:image.

No final do arquivo XML, abaixo da <resources>tag, estava a tag nomeada <image name="imageView:fFo-1g-jzs:image">contendo uma grandemutableData blob.

Após redefinir a referência da imagem no storyboard e remover o blob, o erro desapareceu.


Isso resolveu para mim, procurando esse problema há algum tempo, me deixou louco. O ponto de interrupção não funcionou para mim.
Moshe Gottlieb

O mesmo problema aqui, mas o ponto de interrupção me ajudou a encontrar o xib em que estava. O nome da imagem era Imagem desconhecida no IB.
Josh Bernfeld

1

Acabei de corrigir este erro. Basta verificar o uso da [UIImage imageNamed:(NSString*) imageName]função. Se imageNamefor nil, ocorre um erro.


1

Você está fornecendo um nome de imagem inválido; portanto, para validá-lo antes de colocá-lo, você pode executar qualquer uma das maneiras acima, da forma que for mais adequada para o seu código ou como

if (iconImageName && [iconImageName length])
{

    [UIImage imageNamed:iconImageName];
}
else
{
     iconImageName.hidden = YES;
}

Espero que ajude !!!!


0

O motivo do erro está passando um valor nulo para o método "imageNamed:". Para evitar isso, você pode ocultar o seu imageView ao tentar passar o valor nulo. As chances podem ocorrer na reutilização dos imageViews no UITableView ou podem estar no scrollViews.

Evitei o aviso com a verificação abaixo:

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

Recebi esse aviso ao carregar o uso de imagens [[UIImage imageNamed:normalStr] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]e, quando mudei para [UIImage imageNamed:normalStr], o aviso desapareceu.


0

Uma abordagem é fazer swizzling de método de classe para substituir [UIImage imageNamed:]por sua própria implementação, depois verifique o nome da imagem em sua implementação. Veja o seguinte:

Como swizzle um método de classe no iOS?

Eu implementei isso na minha 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
}

Você pode querer chiar [UIImage imageNamed:inBundle:compatibleWithTraitCollection:]também.


-1

Talvez você possa usar isso para confirmar que "nome_da_imagem" não é "nulo"; então, você deixará esse aviso de lado.

 if (imageName) {
    self.imageView.image = [UIImage imageNamed:imageName];
 }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.