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

创建子工程很简单:

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. 拉曼软件在win8上运行出错问题

    前提:xp上安装运行都没错  xp的.NET 环境是4.0 ,win8 是64位系统.自带.NET Framework 3 (3.0 3.5) 和.NET Framework 4.51:源程序拷贝到w ...

  2. java.io.IOException: No FileSystem for scheme: hdfs

    在这篇文章中,介绍了如何将Maven依赖的包一起打包进jar包.使用maven-assembly打成jar后,将这个jar提供给其他工程引用的时候,报出如下错误: log4j:WARN No appe ...

  3. C语言:链表实现的一个实例

    问题:写一个程序输入你一年看过的所有电影以及每部电影的各种信息(简化问题:每部电影只要求输入片名和评价) 链表实现: #include<stdio.h> #include<stdli ...

  4. Mac配置一些开发环境(随时补充)

    Mac安装mysql并启动 brew install mysql mysql.server start /usr/local/Cellar/mysql/5.6.10/support-files/mys ...

  5. 第三次个人作业——关于K米(Andorid)的案例分析

    第三次个人作业--关于K米(Andorid)的案例分析 1.K米简介 官方网址:http://www.ktvme.com/ 2.评测 2.1.上手体验 带着找bug的心态,兴致勃勃地开始体验 K米.打 ...

  6. Git创建ssh-key

    打开git bash界面,输入: ssh-keygen -t rsa -C "yourname@email.com" 一路回车,后续保持默认值即可. 把C:\users\yourn ...

  7. unix-ln 命令

    指令名称 : ln 使用权限 :所有使用者 使用方式 : ln [options] source dist, 其中 option 的格式为 : [-bdfinsvF] [-S backup-suffi ...

  8. Windows XP SP3 Professional 微软(MSDN)官方原版系统

    Windows XP SP3 Professional 微软(MSDN)官方原版系统 Windows XP(版本号:5.1,开发代号:Whistler)是微软公司推出供个人电脑使用的操作系统,其RTM ...

  9. e_msg_c_gs_enter_gs_req

    e_msg_c_gs_enter_gs_req 就是到GS上验证客户端发送的token是否存在,如果存在返回成功,并把该token删除

  10. TemplateDataField

    .aspx <ig:TemplateDataField Key="TemplateField_0"> <Header Text="selected&qu ...