今天在看HM微博的视频,有个疑问:
MJ老师视频中的代码:
for (int i = 0; i
其中,emotion是一个模型,png是它的属性。
但是问题来了,表情的所有图片和info.plist都是放在蓝色文件里,即
而之前,已经通过以下代码把各个蓝色文件里的info.plist转换为模型。
[[NSBundle mainBundle] pathForResource:@"EmotionIcons/default/info.plist" ofType:nil]
按照网上的一些说法,蓝色文件里的图片不是没法用UIImaged imageNamed吗?
参考:
[[UIImage imageNamed:@"tab_back"]不显示图片的问题解决]
ios开发UIImage imageNamed方法的误用
可是,MJ老师视频用UIImaged imageNamed能够成功显示图片。
我本来也想通过UIImaged imageNamed设置图片,但是不成功。
我的代码是:
HMEmotion *emotion = emotions[i];
if (emotion.png) {
HMLog(@"%@",emotion.png);
[btn setImage:[UIImage imageNamed:emotion.png] forState:UIControlStateNormal];
HMLog(@"%@",btn.currentImage);
}else if (emotion.code){
//设置emoji
// HMLog(@"%@",emotion.code);
[btn setTitle:emotion.code.emoji forState:UIControlStateNormal];
btn.titleLabel.font = [UIFont systemFontOfSize:32];
HMLog(@"%@",btn.currentTitle);
}
log打印信息:
瞧,虽然成功从模型中取得emotion.png的值,但是设置图片没有成功。
原因到底是为什么?从网上找了很久,还是没有找到原因。暂时先记录这个疑问,找到解决方法后再来完善这贴。
待续
通过种种尝试,终于解决了button setImage 不成功的问题。
谷歌,搜索关键字:ios uibutton setimage not working
找到stavkoverflow上的解疑贴:
UIButton setImage not working
帖子中说到,要先检测下有没有成功返回一个有效的image,如下:
然后,我修改了自己的代码:
HMEmotion *emotion = emotions[i];
// HMLog(@"%@",emotions);
if (emotion.png) {
HMLog(@"%@",emotion.png);
UIImage *imageTest = [UIImage imageNamed:emotion.png];
if (imageTest) {
[btn setImage:[UIImage imageNamed:emotion.png] forState:UIControlStateNormal];
}else{
HMLog(@"why is my image object nil?");
}
HMLog(@"%@",btn.currentImage);
}else if (emotion.code){
//设置emoji
// HMLog(@"%@",emotion.code);
[btn setTitle:emotion.code.emoji forState:UIControlStateNormal];
btn.titleLabel.font = [UIFont systemFontOfSize:32];
HMLog(@"%@",btn.currentTitle);
}
[self addSubview:btn];
log打印信息:
从log打印信息,可以看到虽然我成功从模型HMEmotion中取得png的值,但是没有成功返回一张有效的image,所以button setImage自然没法成功执行。
原因,就在于没有成功返回一张有效的image。
解决方案
思路:结合上文UIImage imageNamed没法通过蓝色文件夹设置图片。我猜测可能是路径问题。
所以,我修改图片资源路径,如下:
相应的,需要修改字典转模型的路径代码,如下:
将以上两步修改完后,iOS button setImage终于执行了。
截图:
总结:
虽然找到了自己代码的bug所在,也成功地解决了button setImage设置图片不成功的问题。但是,对于UIImage imageNamed 的疑问还是存留着,以后有时间再研究下。
再待续
刚才拷贝了demo,把app删掉,重新编译运行demo。然后,奇怪的事情发生了,button setImage 又不能执行。种种“奇怪”的事情表明,蓝色文件夹里的图片资源没法用UIImage imageNamed获取。所以,我最终决定把之前三个蓝色文件夹里的资源都存在一个黄色文件夹里,修改他们的info.plist的名字。如下:
结果:终于成功了,而且删掉app重新运行也一样生效。
总结:希望这是最后一次研究这个问题,折腾快6个小时以上了。以后对于大量图片资源(ps:资源很小),要用UIImage imageNamed,但是要放在黄色文件夹里。放在蓝色文件夹里,虽然有时候可能成功加载图片,但是以后可能失效,这都是亲身体验啊!原因见上面有关UIImage imageNamed的两个帖子吧。