今天在看HM微博的視頻赡模,有個(gè)疑問:
MJ老師視頻中的代碼:
for (int i = 0; i<count; i++) {
UIButton *btn = [[UIButton alloc] init];
HWEmotion *emotion = emotions[i];
if (emotion.png) { // 有圖片
[btn setImage:[UIImage imageNamed:emotion.png] forState:UIControlStateNormal];
} else if (emotion.code) { // 是emoji表情
// 設(shè)置emoji
[btn setTitle:emotion.code.emoji forState:UIControlStateNormal];
btn.titleLabel.font = [UIFont systemFontOfSize:32];
}
其中婿着,emotion是一個(gè)模型,png是它的屬性近她。
但是問題來(lái)了翎苫,表情的所有圖片和info.plist都是放在藍(lán)色文件里混蔼,即
而之前宋列,已經(jīng)通過(guò)以下代碼把各個(gè)藍(lán)色文件里的info.plist轉(zhuǎn)換為模型丘侠。
[[NSBundle mainBundle] pathForResource:@"EmotionIcons/default/info.plist" ofType:nil]
按照網(wǎng)上的一些說(shuō)法,藍(lán)色文件里的圖片不是沒法用UIImaged imageNamed嗎攒磨?
參考:
[[UIImage imageNamed:@"tab_back"]不顯示圖片的問題解決]
ios開發(fā)UIImage imageNamed方法的誤用
可是泳桦,MJ老師視頻用UIImaged imageNamed能夠成功顯示圖片。
我本來(lái)也想通過(guò)UIImaged imageNamed設(shè)置圖片娩缰,但是不成功灸撰。
我的代碼是:
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){
//設(shè)置emoji
// HMLog(@"%@",emotion.code);
[btn setTitle:emotion.code.emoji forState:UIControlStateNormal];
btn.titleLabel.font = [UIFont systemFontOfSize:32];
HMLog(@"%@",btn.currentTitle);
}
log打印信息:
瞧,雖然成功從模型中取得emotion.png的值拼坎,但是設(shè)置圖片沒有成功浮毯。
原因到底是為什么?從網(wǎng)上找了很久泰鸡,還是沒有找到原因债蓝。暫時(shí)先記錄這個(gè)疑問,找到解決方法后再來(lái)完善這貼盛龄。
待續(xù)
通過(guò)種種嘗試饰迹,終于解決了button setImage 不成功的問題。
谷歌讯嫂,搜索關(guān)鍵字:ios uibutton setimage not working
找到stavkoverflow上的解疑貼:
UIButton setImage not working
帖子中說(shuō)到蹦锋,要先檢測(cè)下有沒有成功返回一個(gè)有效的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){
//設(shè)置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自然沒法成功執(zhí)行。
原因库正,就在于沒有成功返回一張有效的image曲楚。
解決方案
思路:結(jié)合上文UIImage imageNamed沒法通過(guò)藍(lán)色文件夾設(shè)置圖片。我猜測(cè)可能是路徑問題褥符。
所以龙誊,我修改圖片資源路徑,如下:
相應(yīng)的喷楣,需要修改字典轉(zhuǎn)模型的路徑代碼趟大,如下:
將以上兩步修改完后鹤树,iOS button setImage終于執(zhí)行了。
截圖:
總結(jié):
雖然找到了自己代碼的bug所在逊朽,也成功地解決了button setImage設(shè)置圖片不成功的問題罕伯。但是,對(duì)于UIImage imageNamed 的疑問還是存留著叽讳,以后有時(shí)間再研究下追他。
再待續(xù)
剛才拷貝了demo,把a(bǔ)pp刪掉岛蚤,重新編譯運(yùn)行demo邑狸。然后,奇怪的事情發(fā)生了涤妒,button setImage 又不能執(zhí)行推溃。種種“奇怪”的事情表明,藍(lán)色文件夾里的圖片資源沒法用UIImage imageNamed獲取届腐。所以铁坎,我最終決定把之前三個(gè)藍(lán)色文件夾里的資源都存在一個(gè)黃色文件夾里,修改他們的info.plist的名字犁苏。如下:
結(jié)果:終于成功了硬萍,而且刪掉app重新運(yùn)行也一樣生效。
總結(jié):希望這是最后一次研究這個(gè)問題围详,折騰快6個(gè)小時(shí)以上了朴乖。以后對(duì)于大量圖片資源(ps:資源很小)助赞,要用UIImage imageNamed买羞,但是要放在黃色文件夾里。放在藍(lán)色文件夾里雹食,雖然有時(shí)候可能成功加載圖片畜普,但是以后可能失效,這都是親身體驗(yàn)叭阂丁吃挑!原因見上面有關(guān)UIImage imageNamed的兩個(gè)帖子吧。