TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
TableViewControllerの操作中にこの警告が表示されます。このエラーを修正する方法と、どのブロックが影響を受けますか?
これは、誰かが[UIImage imageNamed:]
にnil
を入れようとしているときに表示されます
[UIImage imageNamed:]
のシンボリックブレークポイントを追加
シミュレータで$arg3 == nil
条件、32ビットiPhoneで$r0 == nil
条件、または64ビットiPhoneで$x2 == nil
条件を追加します。
アプリケーションを実行し、デバッガーが停止する場所を確認します。
追伸これは、イメージ名が空の文字列の場合にも発生することに注意してください。これを確認するには、[(NSString*)$x2 length] == 0
を条件に追加します。
このエラーは(通常)[UIImage imageNamed:myImage]
で画像をロードしようとしたときに発生しますが、iOSはmyImage
が本当にNSString
であるかどうか不明で、この警告が表示されます。
これを修正するには:
[UIImage imageNamed:[NSString stringWithFormat:@"%@", myImage]]
または、単にlength
の名前のUIImage
を確認できます。
if (myImage && [myImage length]) {
[UIImage imageNamed:myImage];
}
指定した名前が(null)
であるというエラーがエラーになっているため、これは[UIImage imageNamed:nil]
の呼び出しが原因である可能性が高いです。より具体的には、変数を渡すことは設定されていないため、nil
と等しくなります。 stringWithFormat:
を使用するとエラーが解消されますが、実際に望んでいることをしていない可能性は十分にあると思います。指定した名前がnil
値である場合、stringWithFormat:を使用すると、[UIImage imageNamed:@"(null)"]
を呼び出しているかのように、文字通り「(null)」という名前の画像を検索します。
このようなものはおそらくより良いオプションです:
if (name) {
UIImage *image = [UIImage imageNamed:name];
} else {
// Do something else
}
最初にnil値でこのコードが呼び出される理由を理解するのに役立つように、Xcodeの「何か他のことをする」行にブレークポイントを設定することができます。
私の場合、[UIImage imageNamed:@ ""]を渡していたため、警告が表示されました。 imageNamedを使用したすべての行にブレークポイントを追加し、警告が見つかった行をデバッグします。
これは、ストーリーボードがいくつかに分割された後に起こりました(休日に実際の変更が行われたため、どのように行われたかはわかりません)。
ストーリーボードのXMLを調べたところ、以前にアセットカタログの「bottomBar」を指していたイメージ参照が、代わりにimageView:fFo-1g-jzs:image
を指していることがわかりました。
<resources>
タグの下のXMLファイルの最後には、<image name="imageView:fFo-1g-jzs:image">
という名前のタグに大きなmutableData
blobが含まれていました。
ストーリーボードの画像参照をリセットし、ブロブを削除すると、エラーはなくなりました。
無効な画像名を指定しているので、それを配置する前に検証する必要があります。上記の方法のいずれかをコードに適した方法で実行できます。
if (iconImageName && [iconImageName length])
{
[UIImage imageNamed:iconImageName];
}
else
{
iconImageName.hidden = YES;
}
それが役立つことを願っています!!!!
[[UIImage imageNamed:normalStr] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
を使用して画像を読み込むと、この警告が表示されますが、[UIImage imageNamed:normalStr]
に変更すると、警告はなくなりました。
1つのアプローチは、クラスメソッドをスウィズルして[UIImage imageNamed:]
を独自の実装に置き換え、実装のイメージ名を確認することです。以下を参照してください。
私はこれを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
}
[UIImage imageNamed:inBundle:compatibleWithTraitCollection:]
も同様にスウィズルすることができます。
エラーの理由は、nil値を「imageNamed:」メソッドに渡すことです。これを回避するには、nil値を渡そうとするときにimageViewを非表示にすることができます。 UITableViewでimageViewsを再利用するか、scrollViewsで可能性があります。
以下のチェックで警告を回避しました:
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;
}
このエラーを修正しました。 [UIImage imageNamed:(NSString*) imageName]
関数の使用法を確認してください。 imageName
がnil
の場合、エラーが発生します。