实际开发中,我们可能会同时开发好几个端,比如楼主目前开发的家教平台,需要老师端,家长端,助教端三个端。有很多工具方法,或者封装的自定义控件都是可以复用的。我们就可以把公用的代码抽取出去,新建一个工程,统一管理。同步维护一份代码,不需要在各个端各自维护。
创建子工程很简单:
1 假设你已经有了自己的工程demo.xcodeproj,首先我们需要创建一个子工程,(File->new->project),我们要选择静态库。如图
点击下一步,给子工程起名字:subProject
点击下一步:选择Add to自己的工程
到此,第一步就结束了,我们创建了一个子工程,而且也添加到了自己的工程里面,但是,这样在自己工程中还是无法引用子工程的类。我们还需要设置一下自己工程的环境变量。
2 设置环境变量:
自己的工程demo下,选择Bulid Settings ,找到User Header Search Paths。设置自己工程的绝对路径,然后设置递归查找文件夹。
3.添加target的依赖关系
我们要保证编译demo的时候先编译subProject。
选中demo Target,然后选中其Build phases选项,添加subProject target
还有生成的.a文件也得添加进来。选择Link Binary With Libraries
这时候一些基本的方法已经可以用起来了。
4、如果子工程中有图片或者依赖文件怎么办?
要把相关的依赖图片copy出去:选中subProject target,进入Build phases选项,找到最下面的copy file栏,添加相关的文件:
5 如果存在category的时候,在demo工程Other Linker Flags里面添加编译的命令:
注意:在ios5以及以上版本中,引入别的工程(如上)或者静态库,
并且StoryBoards中使用了【引入的外部类(外部工程或者静态库里面的类)】,
那么Other Linker Flags 里面必须加上-ObjC,否则,会console会报错
error:Unknown class <外部的类名> in Interface Builder file.
引用:
http://developer.apple.com/library/mac/#qa/qa1490/_index.html
-ObjC,This flag causes the linker to load every object file in the library that defines an Objective-C class or category
意思是,使用这个标识,会把静态库中,定义了Objective-C class的文件或者定义了category类别的文件,全部加载进来。
因为你的静态库里面扩展了一个已存在的类的category,那么这个category是不会加载进来的。
在程序运行中,调用此类别的方法,就会报错“selector not recognized”。
Important: For 64-bit and iPhone OS applications, there is a linker bug that prevents
-ObjC from loading objects files from static libraries that contain only categories and no classes. The workaround is to use the -all_load
or -force_load
flags.
上面的意思是说
对于64位操作系统或者ios系统,-Objc存在一个bug,就是只包含categories ,而没有任何class的静态库,是不会被加载进来。
拮据额这个bug:使用标识符:
-all_load 或者 -force_load
子工程导入完成。整个框架瞬间高大上起来了。参考文章:https://www.ganlvji.com/xcode_subproject_project_dependency/