实际开发中,我们可能会同时开发好几个端,比如楼主目前开发的家教平台,需要老师端,家长端,助教端三个端。有很多工具方法,或者封装的自定义控件都是可以复用的。我们就可以把公用的代码抽取出去,新建一个工程,统一管理。同步维护一份代码,不需要在各个端各自维护。

创建子工程很简单:

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/

iOS创建子工程的更多相关文章

  1. Xcode创建子工程以及工程依赖

    https://www.jianshu.com/p/f2bc7d155a86 阅读 7858 视频地址 如果文章不详细,点击看操作视频 项目需求:代码抽层,业务逻辑和数据处理要高度抽离,模块化,需要将 ...

  2. idea创建父子工程

    第一步:创建一个新的父工程father:file—–>new—->project ,注意要选maven,Create from archetype不要勾选.next填写GroupId .A ...

  3. IDEA中创建父子工程与maven打包Springboot聚合工程报错程序包不存在问题处理

    公司新项目需使用java技术栈,便使用IDEA搭建了一个多SpringBoot项目的聚合工程,因为初次使用,遇到了很多问题,maven打包时各种报错,在网上查了好多终于解决了,为巩固记忆,特作此记录. ...

  4. SpringCloud Alibaba+New搭建企业级开发框架(三):创建New工程

    1.创建父工程:File > New > Project...,选择Maven,Create from archetype不要勾选,点击Next进入下一步,填写工程信息.   image. ...

  5. 在idea中创建maven父子工程,子工程无法导入父工程依赖的问题

    创建maven父子工程时遇到一个问题,当子工程的名称前缀和父工程的名称一样时,子工程会出现一系列的问题.比如我的父工程名称是microservicecloud,子工程名称是microservicecl ...

  6. springboot 创建子父工程

    1.创建子父工程 2.添加pom配置文件 2.1  父工程pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  7. ios 创建sdk与demo同一个工程

    思路摘要: 步骤1:创建一个文件夹用来放该项目 步骤2:设置工程工作区间 步骤3:  创建广告sdk项目 步骤4:创建广告sdkDemo项目 步骤5:配置一些文件 步骤6:将sdk导入到demo中进行 ...

  8. iOS 创建xcode插件

    苹果的"一个足以应付所有"策略使得它的产品越来越像一个难以下咽的药丸.尽管苹果已经将一些工作流带给了iOS/OS X的开发者,我们仍然希望通过插件来使得Xcode更加顺手! 虽然苹 ...

  9. 在VS2015 RC打开CTP中创建的工程

    VS2015终于出了RC了!小伙伴们快来安装试用吧,地址在这里,还有新的Windows 10开发工具哦,要不然是开发不了Universal Windows App的,安装前记得卸载CTP版本. 新的R ...

随机推荐

  1. 修改phpMyAdmin中的默认1440超时时间

    步骤一:修改PHP配置中session的过期时间. session.gc_maxlifetime = 1440 //改为 session.gc_maxlifetime = 14400 步骤二:修改ph ...

  2. Vmware vsphere 网络架构

    VMware vSphere架构下服务器会虚拟出交换机来供ESX Host虚拟机来使用,虚拟交换机有两种,vSwitch虚拟交换机和vNetwork分布式虚拟交换机,每个ESX Host均有一个标准v ...

  3. iOS Keychain钥匙串,应用间数据共享打造iOS上的全家桶

    Demo先行:https://github.com/rayshen/GIKeychainGroupDemo 该demo里有2个工程,你先运行任何一个会存储一个值,再运行另一个会访问之前的app存储的值 ...

  4. jdbc工具类封装

    封装 package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

  5. 网络存储(四)之ISCSI的进阶

    前言 上一篇博客中我们讲了如何搭建一个简单的iscsi网络存储系统,这块有个安全问题就是,任何知道target name的客户端都可以随意连接ISCSI服务器.但是很多时候,通过授权认证连接共享磁盘或 ...

  6. POJ2239 Selecting Courses(二分图最大匹配)

    题目链接 N节课,每节课在一个星期中的某一节,求最多能选几节课 好吧,想了半天没想出来,最后看了题解是二分图最大匹配,好弱 建图: 每节课 与 时间有一条边 #include <iostream ...

  7. /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题

    一.MD(d).MT(d)编译选项的区别 1.编译选项的位置 以VS2005为例,这样子打开: 1)         打开项目的Property Pages对话框 2)         点击左侧C/C ...

  8. phpexcel文本格式

    解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. ...

  9. 横竖屏切换时,Activity的生命周期

    横竖屏切换时,Activity的生命周期 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate-->onStart-->onRe ...

  10. hasClass addClass removeClass

    //函数有class function hasClass(ele,cls){ return -1<(" "+ele.className+" ").inde ...