[JiaJung]&iOS组件化(下篇)-加载XIB、图片资源
本篇是iOS项目实践的最后一篇。大家可以下载demo,根据这几篇文章流程实现一个现有项目的组件化。当然,每个公司根据自己的业务需求组件化的方式会有所不同,但大概的思路和流程不会有很大的差异。
上一篇中完成了专题组件和作者组件的集成及管理。但是加载XIB和图片时任然存在一些问题。切回到FFSpecialKit组件,当点击专题界面中的cell时会报错。这是因为项目中用到XIB加载出错了。

拷贝路径到Finder前往去查看一下,如下图所示指定的bundle路径下确实没有FFSpecialDetailView这样的XIB文件。

回到代码查看一下,原来加载XIB的方式如下:

显然通过加载上面的bundle的方式加载不到XIB,需要重新设置budle的路径,修改如下:

拷贝路径前往查看,XIB果然在指定的bundle下

再次运行,点击专题cell测试就可以正常跳转了。不难发现cell中一些图片资源未显示(比如:灰色的线、评论、点赞等图标),接下来需要处理这些图片资源显示的问题。

是否记得在FFSpecialKit中和Classes文件夹同级有个Assets文件夹,该文件夹专门用来存放组件的资源文件。

接着,把图片资源拖入Assets文件夹,需要修改.podspec文件,打开资源的加载路径,然后执行pod install。然后会发现多了一个Resource的资源文件夹。

运行发现图片任然未显示,这是因为项目中是通过[UIImage imageNamed:@“图片名"]方式加载本地图片,这种方式默认是从mainBundle中去加载图片,和XIB的问题一样也会找不到图片。


我们发现图片实际是在FFSpecialKit组件下FFSpecialKit.bundle 里面,因此需要改变图片的加载方式.
说明:必须指明图片的全名和图片所在bundle的包名.

因为涉及到@2x,@3x图片这里不能写成固定的,应该按照scale来设置

再次运行图片就显示了

因为之前设置图片的方式都需要修改,上面修改图片加载方式的代码在很多地方都会用到,所以最好的做法就是抽取一个工具方法,笔者这里是添加了一个UIImage的分类。把这个分类添加到基础组件FFCategory中,更新组件就ok了。
#import <UIKit/UIKit.h>
@interface UIImage (Extension)
+ (instancetype)ff_imagePathWithName:(NSString *)imageName bundle:(NSString *)bundle targetClass:(Class)targetClass;
@end
#import "UIImage+Extension.h"
@implementation UIImage (Extension)
+ (instancetype)ff_imagePathWithName:(NSString *)imageName bundle:(NSString *)bundle targetClass:(Class)targetClass {
NSInteger scale = [[UIScreen mainScreen] scale];
NSBundle *currentBundle = [NSBundle bundleForClass:targetClass];
NSString *name = [NSString stringWithFormat:@"%@@%zdx",imageName,scale];
NSString *dir = [NSString stringWithFormat:@"%@.bundle",bundle];
NSString *path = [currentBundle pathForResource:name ofType:@"png" inDirectory:dir];
return path ? [UIImage imageWithContentsOfFile:path] : nil;
}
@end
回到项目用该Category更新代码

再次运行,相关图片就显示出来了。

细心的朋友会发现字体发生了变化,接下来设置字体,将字体相关文件也拖入到Assets文件夹下,然后修改一下podspec文件。最后执行pod install把字体资源pod进来。
修改FFSpecial.podspec文件如下:
s.resource_bundles = {
'FFSpecialKit' => ['FFSpecialKit/Assets/*']
}
执行完pod install之后,字体资源就pod 进来了。

接着在原来设置字体的地方做相应的修改,和修改图片资源路径的方式相似。例如修改FFSpecialCell中的代码如下,通过加载bundle路径的方式加载字体。当然,因为有很多的地方都会用到,最好也抽取成工具类。
- (UILabel *)categoryLabel{
if (_categoryLabel == nil) {
_categoryLabel = [[UILabel alloc]init];
NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
NSString *path = [currentBundle pathForResource:@"CODE BOLD.OTF" ofType:nil inDirectory:@"FFSpecialKit"];
[_categoryLabel text:nil textColor:kHexColor_c7a762 fontSize:FONT_SIZE_14 fontName:path];
}
return _categoryLabel;
}
- (UILabel *)titleLabel{
if (_titleLabel == nil) {
_titleLabel = [[UILabel alloc]init];
NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
NSString *path = [currentBundle pathForResource:@"CODE LIGHT.OTF" ofType:nil inDirectory:@"FFSpecialKit.bundle"];
[_titleLabel text:nil textColor:kHexColor_555 fontSize:FONT_SIZE_14 fontName:path];
}
return _titleLabel;
}
- (UILabel *)descLabel{
if (_descLabel == nil) {
_descLabel = [[UILabel alloc]init];
NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
NSString *path = [currentBundle pathForResource:@"CODE LIGHT.OTF" ofType:nil inDirectory:@"FFSpecialKit.bundle"];
[_descLabel text:nil textColor:kHexColor_555 fontSize:FONT_SIZE_12 fontName:path];
_descLabel.numberOfLines = 2;
}
return _descLabel;
}
到这里都修改完后,再次运行就ok了。

后记
笔者通上、中、下三篇文章叙述了iOS项目实现组件化的一个大概流程。很感谢大家的阅读,也希望对您有所帮助。当然,如果对您没有帮助,浪费了您宝贵,笔者深感抱歉。第一次在简书上写技术文章,笔者小学语文没有学好,语言组织匮乏,希望各位多多指点。相互交流、相互成长。
小礼物走一走,来简书关注我
我从码云上下载下来的LDBase Development Pods下xib有 但是我从cocopods下安装的没xib文件 安装的版本号 也是最新的
现在有个很大的疑惑是 我把.h .m .xib拖到classes文件夹下 编译 改spec文件的版本号 打标签 把本地的私有库搞到远程私有索引库里
然后cd 到Example里 pod install
安装完之后 ! 只有.h 和.m 在Development Pods下 为什么.xib没出现呢s.resource_bundles = {
'LDBase' => ['LDBase/Assets/*.png','LDBase/Classes/MainFrame/*.xib']
}
得需要我手动 addFilesToPods
NSBundle *bundle = [NSBundle bundleForClass:self.class];
加载xib这块 我如上这么写 这个bundle只是定位到了.app的文件 没有定位到.framework文件 您知道咋嘛回事吗
出现这种情况 只能说明你打包的方式有问题,其实在刚开始打包的时候指定资源目录就可以避免了,就是 s.resource
我在XIB文件里直接用了图片显示不出来,同事的却可以显示。您遇到过吗?
而且我的Resources下是这样Resources/GOYOTowerCraneModule/Assets展示的,不是像您那样直接展出图片的。
图片要写全名,那么2x图和3x图怎么作区分,难道要在代码里判断看,还是说虽然写的是2x的图,但是系统会根据需要加载3x的??
最近也在研究组件化,想问下,对应网络请求的同意错误时放到网络层,还是放在业务层的base类呢
提供的demo不是完成组件化之后的demo?
请问下,FFSpecialKit这个项目修改后pod install,FlowerField项目应该怎么把FFSpecialKit修改的东西拉取下来呢?git不太懂,是FFSpecialKit修改后提交新版本吗?!s.version可以不改动不?感觉每次修改一点点就提交新版本体验不太好,有没有什么办法呢大佬。
非常细致,很赞,我还有个问题就是这个pod多语言语言国际化怎么整啊
🙄
大公司裸辞三个月不到,别人问我:平台大,工资高,前景好,你为什么还要辞职?我能在十分钟内能写篇800字夹叙夹议的文章哭诉大 公司满是弊病。 但当别人问到我,是选择大公司还是小公司时,我的答案通常会是:最好别去小公司,首选大公司。为什么? 1、大公司:替人打工的感觉会没那么强烈。 认识几个比较年轻的创业公司老板,都有一个共同特点:爱讽刺打工者。做老板的人,一旦开始膨胀,典型表现就是爱歧视在工作岗位上辛辛苦苦挣工资的人:diss打工者是弱智老板刷存在感的利器。 创业公司老板A,最爱在朋友圈发的鸡汤主题是:为什么大多数人都在朝九晚五中走向平庸,因为他们害怕改变,所以只能一辈子为人打工。鸡汤没毛...
Android进阶开发写了这么多年,终于有了一点点成就感。 因为工作关系,我之前认识的一个叫做橙子的游客,有一天在微信上和我聊。说看到了一个同样的叫东方地秀的人写的文章,问是不是我?同时发来了截图。我说,当然是我呀,我都写了好多年了。 她说我写得真好,她看了很多我写的文章。说实话我很感动,那些曾经熬过的夜,似乎都变得无足轻重。被这样一个只有一面之交的美女所夸奖,我感到很欣慰。 橙子现在在深圳,当时,她来敦煌的时候还是一个单身贵族,现在已然是一个宝宝的妈妈了。 六年前,我们有一面之交,彼此加了微信。 可能都忙,也没有聊过,最多点个赞,表示“朕已阅”。 没想到,她还记得我。这也是我们第一次聊天。 感谢旅游,让我们...
东方地秀文|赵晓璃 写在前面的话: 你有没有这样的苦恼,那就是眼前的工作味同嚼蜡,每天苦哈哈地上班,却丝毫没有成就感? 你可曾有过这样的期待,想要找到能调动浑身上下每一个细胞的工作,然后兴致勃勃地投入? 你仗着年轻不断切换职业跑道,做了很多种尝试却依然一事无成。 有一天,你突然惊觉,自己仿佛不再年轻了。 前所未有的惶恐与焦灼宛如潮水般向你涌来...... 一、 咨询者小雪(化名)站在职业选择的十字路口,不禁倍感迷茫。 小雪,女,26岁,高中学的理科,后在家人的建议下报考了电子信息工程专业,学习期间才发现,自己对这种了无生趣的信号、冰冷的设备等完全无感,想到自己今后要是从事这个领域的工作,岂不是活...
赵晓璃单位要在年轻人中提拔一批中层干部,王甲跟李乙都在考察范围内。 王甲回家后跟妻子商量。一致认为,要万无一失,得给领导包个红包,这是潜规则。王甲准备的红包里包了两万。 李乙回家后跟妻子商量。一致认为,要万无一失,得给领导包个红包,这是潜规则。李乙准备的红包里包了两万。 从领导家回来后,王甲高兴的给妻子说:领导清廉,不要红包,让他努力工作就行。 从领导家回来后,李乙表情凝重的给妻子说:领导没要红包,应该是嫌少,得给包一个大一些的红包,明天再去,给包四万。妻然之。 不久,任命结果出来了,王甲、李乙均赫然在列。 回家后,王甲兴奋的给妻子说:领导果然清廉,以后一定要努力工作,报答领导的知遇之恩...
南山顽石当写下这个题目时,有些自惭形愧,这么些年,很少执笔写老师,而今天,就用浅浅的文字,说些心中搁置已久的话。 小的时候,不懂老师,觉得老师是一项高尚的职业,教书育人,孜孜不倦,老师给我的印象总是那么高大威猛,博大精深,所以,那个时候很怕老师,生怕做错了事,被老师惩罚。 稍大点,能明白老师的辛苦,但不能体会,每次老师站在讲台给我们讲题的时候,反复强调知识点,反复叮嘱我们这个知识点一定要弄懂,高考、中考就考这个,只要会了这个知识点就能考到自己理想的学校,那个时候,我看得到老师眼睛里的真诚和执着。 再大点,能明白当一个老师是不容易的,而当一个好老师,更是那么的不易,她(他)要付出的又何止是知识,还...
澜嫣
188道iOS中高级核心面试题,我只能帮你在这里了!
在2018年底,小编混迹在各种iOS交流群中,整理出了将近两百道大厂最喜欢在面试问到的问题,今天在这里分享给大家[免费获取方式在最后]! 小编就不在这里全部列举出来了,可以在前面的看到,文档里面包括了目前比较受欢迎的所有面试题!有需要获取的话,可以加QQ群:67988454...
鹅厂,iOS高级开发精选面试题!
前言 为防止背题,大部分题目不设标准答案,重点考察面试者的基础知识和思维逻辑,答案的提示见后面。 正文 题目1、举例两个遇到过印象深刻的外网Crash,并介绍如何发现、定位、解决;题目2、举例两个性能问题的优化,并介绍如何发现、定位、解决以及原理;题目3、介绍Objecti...
iOS开发笔记(十一)— UITableView、ARC、xcconfig、Push
前言 分享iOS开发中遇到的问题,和相关的一些思考,本次内容包括:UITableView滚动问题、ARC、xcconfig、Push证书。 正文 UITableView UITableView在reloadData 的时候,如果height的高度发生较大变化,content...
在主线程操作UI 一定要在主线程里执行UI操作,这是一个初级工程师都应该懂得的道理,但是,在实际开发中,我们往往陷入这个巨坑,而找不到原因。最典型的一个例子就是在失败的回调里面处理UI,失败的回调很多情况下是在子线程的,如果直接处理UI,会导致崩溃,而且这种奔溃发现不了原因...
ios审核所遇到苹果appstore3.1.1Guideline3.1.1问题处理苹果3.1.1被拒
辛辛苦苦开发好几个月,却迟迟不能上线,每次苹果审核真的是很麻烦的事情,我们app18年4月份开发好,安卓各大应用市场都通过了,蓄势待发,万事俱备,只欠东风,就是欠苹果审核通过,因为产品涉及到虚拟支付,但是又不想用苹果内购,1.很多用户不会用,用起来麻烦,2.扣点太高30%,...
很多人跑步都会听音乐,广播或新闻(真有人听新闻吗?),平时我在干家务或者散步的的时候也喜欢带个耳机听,但只有跑步,每次带上耳机我就会变得浮躁,感觉跑步节奏会跟着听到的音乐或广播语调变得时快时慢紊乱不已,就因为这个莫名其妙的原因,我就跟着潮流很酷地带着耳机跑步了,每...
在爱情里面,有些人会是甜蜜的,有些人会是被束缚了的,那对于不同性格的12生肖来说,其在被爱情束缚了,没有自主权了,那么会怎么样的呢,对于生肖属兔人来说,又如何? 我们生肖属兔的人本来就是那种活泼自信的,无论是在面对好友,亦或是陌生人的时候,都是可以侃侃而谈的,特别有激情的那...
20140928——绘画(小雨滴答)+广场舞
由于最近开始工作有些小变动,开始要每天上班。我的生活也相应的会有些变化。现在没太多自由的时间,只能把每天中午吃饭后半小时好好利用下。 昨天下班回去后跟宝宝玩,照常拿笔在纸上乱画。不过,令人惊讶的是昨天竟然有简单的故事情节了。
新疆穿越之旅同车伙伴的幸福陪伴纪念
每个遇见的人都是前世未尽的缘分,此次新疆千车万人3000公里穿越沙漠戈壁之旅遇到同车另外三个伙伴是最荣幸且幸福的一件美事。今年的十一是有生以前过得最有意义的一个长假期,结婚后第一次一个人排除万难参加这么久的一次旅行,也是最快乐的一次放行,全程大笑着度过此行6天6夜,是...
T










浙公网安备 33010602011771号