前言:上章讲过.a/.framework/.bundle的介绍与使用,当我们将一个自己封装好的功能打包成资源包,并使用到项目中时,我们或许都遇到过类似问题:
虽然之前封装的资源包是多场合适用、自己或者他人直接导入即可方便使用的。但当我们将你封装好的资源包导入项目中,需求发生变化,而你的资源包功能不能完全符合的情况;此时,你一定希望,你封装的资源包可以是实时修改的。
本文将以.framework资源包为例,详细介绍,如何将你的资源包导入你的项目当中,并配套该资源包的实时修改方法。
演示demo:演示demo
一: 上章讲过如何将一个.framework包整合到你项目中,如图,FrameworkTest为你创建好的.framewor资源包,test为我们要用来测试的项目工程(你的项目):
图一:

二: 将你的.framework拖入到你的项目中,如图:
图二:

此时,只需在你项目的目标控制器(viewController)中,导入并调用方法即可使用你在.framework中封装好的功能,如图:
图三:

好,到此,基本的.framework集成使用,已经完成。下面将开始,如何实时修改你的.framework;
注意⚠️:如果打包无法通过,请检查你的.framework包或者.a库,在生成时是否兼容了对应的ARM(http://blog.csdn.net/lizhongfu2013/article/details/42387311)。
如果兼容无误,请设置:TARGETS->Build Settings ->Enable Bitcode 为No;
如图:(然后再尝试打包)

三:实时修改已经封装好的.framework来适用项目不断更改的需求:
(1.)你已经将.framework导入到你的项目中来,但是要想实时修改你的.framework,你还需要做的就是,将你创建的.framework做为一个单独的工程导入到你的项目中来。
还记得图一的两个文件吗:

左边那个Framework是你打包好的.framewor,文件内容如图:

这些都是你创建.framework的文件,创建一个空文件,命名为你需要的名字(本处为了方便,直接使用原来文件夹:FrameworkTest);将这些文件(原FrameworkTest下所有文件)放入到你创建的这个文件夹下,然后导入你的项目中,如图:

图中箭头指的是你拖入的文件夹,下边包含了你创建.framework和将.framwork整合的agg集合;不知道集合agg的查看上一章(.a/.framework/.bundle的理解使用)中的介绍。
好心的我,就再给你们张图吧:

好,到这里,我们需要的准备工作都已完成,接下来就是实现如何实时修改你封装好的.framework了;
(2.)实时修改.framework中功能:
此处集成的是一个饼状图和扇形图的实现效果,实现效果如图:

为了方便比较,我们假设需要将其中的扇形图修改为空心的,而我们之前封装的.framework恰好没有将这一修改参数开放出来。此时我们就需要进入.framework文件的实现文件中进行修改,然后重新运行:(当然这种考虑不周的封装在开发中当然是不允许的,此处为了说明问题,做个假设)

上图可以看到,我们在导入的.framework中,找到实现该方法的地方(MYHCircleView.m)中,找到该方法,进行修改;然后重新运行即可;
哎,为了维护宇宙的和平,我尽量多做些解释:
先来看下没有修改前的效果图,方便与修改后的效果做对比:
修改前:

修改后:

注意:如遇到编译找不到文件的类似错误,可以尝试先运行下你的.framework 和你的三个圈(agg集合文件),然后再运行你的项目,如图:

到此,你一定会问,既然这么麻烦,那我干嘛还要导入一个资源包,直接将功能块封装导入,每次修改不是更方便吗?
嗯,我也一直这样认为,直到......,你懂的。
我们这样做,只是在项目开发阶段。到项目上线的时候,还是要将你导入的那部分从项目中删除掉的。你真正打包到appstore上的包,是只包含了.framework的。而你这么做的好处就是,你在完善这个封装的功能块,并为你之后使用该功能块提供了方便。而且你的功能块如果只是为了使用不需要看到实现的话,这么做也是个很好的方法。还有就是,如果你知道组件化概念的话,你就会明白,将你的功能模块化,并分离、封装出来是多么有用了!
为了防止世界被破坏,也为了防止刚才我说的那句有人不懂,我再给个图吧。项目要上线的时候,我们要删除掉你导入的那部分,是哪部分呢?简单说,就是你封装打包的.framework文件部分,如图:

图中框住部分为,你为了能实时修改你的.framework而导入的部分,现在你要上线,你得删除他。而箭头部分的你要留着。
你可以当作你导入的就是一个sdk,而你有修改sdk的权限(FrameworkTest下的文件);
网友评论