Error: CUICatalog: Invalid asset name supplied: (null), or invalid scale factor : 2.000000

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

Screenshot added

Getting this warning while working with TableViewController. How to rectify this error and which block is affected?

89045 次浏览

这个错误(通常)发生在你试图用 [UIImage imageNamed:myImage]加载一个图像,但是 iOS 不确定 myImage是否真的是一个 NSString,然后你有这个警告。

您可以使用以下方法修复这个问题:

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

或者你可以简单地检查 UIImage名称的 length:

if (myImage && [myImage length]) {


[UIImage imageNamed:myImage];
}

因为错误是抱怨您给出的名称是 (null),所以这很可能是由调用 [UIImage imageNamed:nil]引起的。或者更具体地说,传入的变量还没有设置,所以它等于 nil。虽然使用 stringWithFormat:可以消除这个错误,但是我认为很有可能它并没有实际执行您想要的操作。如果您提供的名称是 nil值,那么使用 stringWithFormat: 将导致查找字面上名为“(null)”的图像,就像调用 [UIImage imageNamed:@"(null)"]一样。

这样的事情可能是一个更好的选择:

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

您可能需要在 Xcode 的“ Do something else”行上设置一个断点,以帮助您找出为什么首先调用这段代码时使用 nil 值。

我刚刚修正了这个错误。只需检查 [UIImage imageNamed:(NSString*) imageName]函数的使用情况。如果 imageNamenil,则会发生错误。

当有人试图将 nil放入 [UIImage imageNamed:]时,就会出现这个问题

[UIImage imageNamed:] < img src = “ https://i.stack.imgur.com/ATz38.png”alt = “ Symbolic breakpoint example”> 添加符号断点

在 Simulator 上添加 $arg3 == nil条件,在32位 iPhone 上添加 $r0 == nil条件,或在64位 iPhone 上添加 $x2 == nil条件。

运行应用程序并查看调试器将在哪里停止。

请记住,如果图像名为空字符串,也会发生这种情况。您可以通过向条件中添加 [(NSString*)$x2 length] == 0来检查这一点。

在我的例子中,我传递了[ UIImage image Named:@“”] ,这导致我显示了警告。只需将断点添加到您使用 imageName 的所有行中,并在找到警告的行中进行调试。

在 Xcode 6.4中,当使用“ Selected Image”作为情节串连板中的标签栏项时,即使它是一个有效的图像,也会出现这种情况。

enter image description here

这实际上似乎并没有设置选定的状态图像,所以它需要在 User Defied Runtime Attritribute 中定义,并从 Tab Bar Item 的 SelectedImage 属性中删除

enter image description here

错误的原因是将一个 nil 值传递给“ imageNamed:”方法。为了避免这种情况,可以在尝试传递 nil 值时隐藏 imageView。在 UITableView 中重用 image 视图时可能会出现这种情况,在 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:normalStr] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal],然后,我改为 [UIImage imageNamed:normalStr],警告消失了。

一种方法是使用类方法 swizzling 将 [UIImage imageNamed:]替换为您自己的实现,然后检查实现中的映像名称。请参阅以下内容:

如何在 iOS 上调整类方法?

我在我的 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:]

您正在提供一些无效的图像名称,因此在放置它之前需要进行验证,您可以采用上述任何一种方法,只要对您的代码或类似的代码有意义

if (iconImageName && [iconImageName length])
{


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

希望能有所帮助!

也许您可以使用它来确认“ imageName”不是“ nil”; 然后您将删除这个警告。

 if (imageName) {
self.imageView.image = [UIImage imageNamed:imageName];
}

这种情况发生在故事板被分割成几个之后(实际的变化发生在我度假的时候,所以我不知道它是如何完成的)。

在检查了故事板的 XML 之后,我发现之前指向资产目录中的“ bottomBar”的图像引用指向 imageView:fFo-1g-jzs:image

<resources>标记下的 XML 文件的末尾有一个名为 <image name="imageView:fFo-1g-jzs:image">的标记,其中包含一个大的 mutableData blob。

重置故事板中的图像引用并删除斑点之后,错误就消失了。