Xcode警告[framework] CUICatalog: Invalid asset name supplied: '' 这是因为你的UIImage没有赋值图片,影响不大,但是警告很烦,以下就是找到问题的方法
1、创建UIImage的分类,如 #import "UIImage+JSYNono.h"
2、在.h和.m文件中复制以下代码:
.h文件:
#import
#define is_IPhone (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define is_IPad (UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPad)
NS_ASSUME_NONNULL_BEGIN
@interfaceUIImage(JSYNono)
+ (__kindofUIImage*)jsy_imageNamed:(NSString*)imageName;
@end
NS_ASSUME_NONNULL_END
.m文件:
// 查看警告 CUICatalog: Invalid asset name supplied
#import "UIImage+JSYNono.h"
#import
@implementation UIImage (JSYNono)
// load方法是应用程序把这个类加载到内存的时候调用,而且只会调用一次,所以在这个方法中实现方法的交换最合适
+ (void)load
{
// 交换方法实现,方法都是定义在类里面
// class_getMethodImplementation:获取方法实现
// class_getInstanceMethod:获取对象
// class_getClassMethod:获取类方法
// IMP:方法实现
// Class:获取哪个类方法
// SEL:获取方法编号,根据SEL就能去对应的类找方法
// 获取系统的方法
MethodimageNameMethod =class_getClassMethod([self class],@selector(imageNamed:));
// 获取自定义方法jsy_imageNamed
Methodjsy_imageNamedMethod =class_getClassMethod([UIImage class],@selector(jsy_imageNamed:));
// 交换方法实现
method_exchangeImplementations(imageNameMethod, jsy_imageNamedMethod);
}
+ (UIImage*)jsy_imageNamed:(NSString*)imageName
{
// 1.恢复系统方法加载图片功能
// 注意:这里不会死循环,因为此时已经交换了方法,调用这个方法,其实是调用系统的方法
// 注意:这里调用系统的方法不能用super,因为在分类里面不能调用super,分类没有父类
if(is_IPhone){
// iphone处理
UIImage* image = [self jsy_imageNamed:imageName];
if(image !=nil) {
return image;
}else{
NSLog(@"加载image为空");
return nil;
}
}else{
// ipad处理
UIImage*image = [self jsy_imageNamed:[NSStringstringWithFormat:@"%@_ipad",imageName]];
if(image !=nil) {
return image;
}else{
image = [self jsy_imageNamed:imageName];
return image;
}
}
}
@end
3、把#import "UIImage+JSYNono.h"放在pch中就可以了
测试代码:[UIImage imageNamed:@""]; 这里没有传图片,会打印:加载image为空
上述代码可以反应图片赋值为空,找到问题解决很简单,没有图片就不赋值,这个警告就没有了
+(instancetype)imageViewWithFrame:(CGRect)frame imageName:(NSString*)imageName{
UIImageView* imgView = [[UIImageView alloc]initWithFrame:frame];
if(imageName.length>0) {
imgView.image= [UIImage imageNamed:imageName] ;
}
return imgView;
}
网友评论