TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
Getting this warning while working with TableViewController. How to rectify this error and which block is affected?
这个错误(通常)发生在你试图用 [UIImage imageNamed:myImage]加载一个图像,但是 iOS 不确定 myImage是否真的是一个 NSString,然后你有这个警告。
[UIImage imageNamed:myImage]
myImage
NSString
您可以使用以下方法修复这个问题:
[UIImage imageNamed:[NSString stringWithFormat:@"%@", myImage]]
或者你可以简单地检查 UIImage名称的 length:
UIImage
length
if (myImage && [myImage length]) { [UIImage imageNamed:myImage]; }
因为错误是抱怨您给出的名称是 (null),所以这很可能是由调用 [UIImage imageNamed:nil]引起的。或者更具体地说,传入的变量还没有设置,所以它等于 nil。虽然使用 stringWithFormat:可以消除这个错误,但是我认为很有可能它并没有实际执行您想要的操作。如果您提供的名称是 nil值,那么使用 stringWithFormat: 将导致查找字面上名为“(null)”的图像,就像调用 [UIImage imageNamed:@"(null)"]一样。
(null)
[UIImage imageNamed:nil]
nil
stringWithFormat:
[UIImage imageNamed:@"(null)"]
这样的事情可能是一个更好的选择:
if (name) { UIImage *image = [UIImage imageNamed:name]; } else { // Do something else }
您可能需要在 Xcode 的“ Do something else”行上设置一个断点,以帮助您找出为什么首先调用这段代码时使用 nil 值。
我刚刚修正了这个错误。只需检查 [UIImage imageNamed:(NSString*) imageName]函数的使用情况。如果 imageName是 nil,则会发生错误。
[UIImage imageNamed:(NSString*) imageName]
imageName
当有人试图将 nil放入 [UIImage imageNamed:]时,就会出现这个问题
[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条件。
$arg3 == nil
$r0 == nil
$x2 == nil
运行应用程序并查看调试器将在哪里停止。
请记住,如果图像名为空字符串,也会发生这种情况。您可以通过向条件中添加 [(NSString*)$x2 length] == 0来检查这一点。
[(NSString*)$x2 length] == 0
在我的例子中,我传递了[ UIImage image Named:@“”] ,这导致我显示了警告。只需将断点添加到您使用 imageName 的所有行中,并在找到警告的行中进行调试。
在 Xcode 6.4中,当使用“ Selected Image”作为情节串连板中的标签栏项时,即使它是一个有效的图像,也会出现这种情况。
这实际上似乎并没有设置选定的状态图像,所以它需要在 User Defied Runtime Attritribute 中定义,并从 Tab Bar Item 的 SelectedImage 属性中删除
错误的原因是将一个 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],警告消失了。
[[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:]。
[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。
imageView:fFo-1g-jzs:image
在 <resources>标记下的 XML 文件的末尾有一个名为 <image name="imageView:fFo-1g-jzs:image">的标记,其中包含一个大的 mutableData blob。
<resources>
<image name="imageView:fFo-1g-jzs:image">
mutableData
重置故事板中的图像引用并删除斑点之后,错误就消失了。