iOS button setImage 的疑问

今天在看HM微博的视频,有个疑问:
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表情
            // 设置emoji
            [btn setTitle:emotion.code.emoji forState:UIControlStateNormal];
            btn.titleLabel.font = [UIFont systemFontOfSize:32];
        }

其中,emotion是一个模型,png是它的属性。

屏幕快照 2015-09-21 下午10.55.04.png
但是问题来了,表情的所有图片和info.plist都是放在蓝色文件里,即
屏幕快照 2015-09-21 下午10.56.36.png

而之前,已经通过以下代码把各个蓝色文件里的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打印信息:

屏幕快照 2015-09-21 下午11.07.32.png

瞧,虽然成功从模型中取得emotion.png的值,但是设置图片没有成功。

原因到底是为什么?从网上找了很久,还是没有找到原因。暂时先记录这个疑问,找到解决方法后再来完善这贴。

待续

通过种种尝试,终于解决了button setImage 不成功的问题。
谷歌,搜索关键字:ios uibutton setimage not working

屏幕快照 2015-09-22 下午3.36.52.png

找到stavkoverflow上的解疑贴:
UIButton setImage not working

帖子中说到,要先检测下有没有成功返回一个有效的image,如下:

屏幕快照 2015-09-22 下午3.38.10.png

然后,我修改了自己的代码:

        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打印信息:

屏幕快照 2015-09-22 下午3.41.50.png

从log打印信息,可以看到虽然我成功从模型HMEmotion中取得png的值,但是没有成功返回一张有效的image,所以button setImage自然没法成功执行。

原因,就在于没有成功返回一张有效的image。
解决方案

思路:结合上文UIImage imageNamed没法通过蓝色文件夹设置图片。我猜测可能是路径问题。
所以,我修改图片资源路径,如下:

屏幕快照 2015-09-22 下午3.46.03.png

相应的,需要修改字典转模型的路径代码,如下:

屏幕快照 2015-09-22 下午3.46.48.png

将以上两步修改完后,iOS button setImage终于执行了。
截图:

屏幕快照 2015-09-22 下午3.48.19.png

总结:
虽然找到了自己代码的bug所在,也成功地解决了button setImage设置图片不成功的问题。但是,对于UIImage imageNamed 的疑问还是存留着,以后有时间再研究下。

再待续

刚才拷贝了demo,把app删掉,重新编译运行demo。然后,奇怪的事情发生了,button setImage 又不能执行。种种“奇怪”的事情表明,蓝色文件夹里的图片资源没法用UIImage imageNamed获取。所以,我最终决定把之前三个蓝色文件夹里的资源都存在一个黄色文件夹里,修改他们的info.plist的名字。如下:

屏幕快照 2015-09-22 下午4.59.19.png

结果:终于成功了,而且删掉app重新运行也一样生效。

屏幕快照 2015-09-22 下午4.59.43.png

总结:希望这是最后一次研究这个问题,折腾快6个小时以上了。以后对于大量图片资源(ps:资源很小),要用UIImage imageNamed,但是要放在黄色文件夹里。放在蓝色文件夹里,虽然有时候可能成功加载图片,但是以后可能失效,这都是亲身体验啊!原因见上面有关UIImage imageNamed的两个帖子吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,752评论 2 7
  • 1、禁止手机睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa阅读 1,152评论 1 6
  • 那年那月,正是青春年少,爱上了写作,没有目标设计的爱好。 不知道经历过多少的春夏秋冬,也不知道...
    白丰阁阅读 649评论 2 3
  • 难熬的深夜 死亡来迎接 寄托与被寄托的无奈 撕裂的伤口无法愈合 被分割无数个日日夜夜 舔舐着虚伪的姿态 挥洒着得不...
    胤女阅读 196评论 0 4
  • 程序猿的开心一刻 下面哪种面向对象的方法可以让你变得富有?a,继承;b,封装;c,多态;d,抽象。 请在评论区输入...
    狼牙战士阅读 2,193评论 0 6