TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
Recebendo esse aviso ao trabalhar com o TableViewController. Como corrigir esse erro e qual bloco é afetado?
TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
Recebendo esse aviso ao trabalhar com o TableViewController. Como corrigir esse erro e qual bloco é afetado?
Respostas:
Este aparece quando alguém está tentando colocar nil
em[UIImage imageNamed:]
Adicionar ponto de interrupção simbólico para [UIImage imageNamed:]
Adicione $arg3 == nil
condição no Simulador, $r0 == nil
condição no iPhone de 32 bits ou $x2 == nil
no 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.
UIImage imageNamed:
, mas estou salvando esse ponto de interrupção.
$arg3
sintaxe para pontos de interrupção condicionais. Onde posso aprender mais?
error: use of undeclared identifier '$arg3'
. Perdi alguma coisa?
(int)[$arg3 length] == 0
Esse erro (geralmente) ocorre quando você tenta carregar uma imagem, [UIImage imageNamed:myImage]
mas o iOS não tem certeza se myImage
é realmente um NSString
e então você tem esse aviso.
Você pode corrigir isso usando:
[UIImage imageNamed:[NSString stringWithFormat:@"%@", myImage]]
Ou você pode simplesmente verificar length
o nome do UIImage
:
if (myImage && [myImage length]) {
[UIImage imageNamed:myImage];
}
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 nil
valor, 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.
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.
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
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.
[UIImage imageNamed:@""]
. Como você consertou isso?
if
para 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"?
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.
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 !!!!
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;
}
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.
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];
}