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 nilem[UIImage imageNamed:]
Adicionar ponto de interrupção simbólico para [UIImage imageNamed:]
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.
UIImage imageNamed:, mas estou salvando esse ponto de interrupção.
$arg3sintaxe 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 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];
}
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.
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?
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"?
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];
}